Make Graphics thread-safety optional

This commit is contained in:
Snowdream 2022-07-16 20:15:09 -04:00
parent b0e08f60bb
commit dba559aafb
4 changed files with 33 additions and 15 deletions

View file

@ -356,6 +356,7 @@ DEF_GRA_PROP_B(FixedAspectRatio)
DEF_GRA_PROP_B(SmoothScaling) DEF_GRA_PROP_B(SmoothScaling)
DEF_GRA_PROP_B(IntegerScaling) DEF_GRA_PROP_B(IntegerScaling)
DEF_GRA_PROP_B(LastMileScaling) DEF_GRA_PROP_B(LastMileScaling)
DEF_GRA_PROP_B(Threadsafe)
#define INIT_GRA_PROP_BIND(PropName, prop_name_s) \ #define INIT_GRA_PROP_BIND(PropName, prop_name_s) \
{ \ { \
@ -407,4 +408,5 @@ void graphicsBindingInit()
INIT_GRA_PROP_BIND( SmoothScaling, "smooth_scaling" ); INIT_GRA_PROP_BIND( SmoothScaling, "smooth_scaling" );
INIT_GRA_PROP_BIND( IntegerScaling, "integer_scaling" ); INIT_GRA_PROP_BIND( IntegerScaling, "integer_scaling" );
INIT_GRA_PROP_BIND( LastMileScaling, "last_mile_scaling" ); INIT_GRA_PROP_BIND( LastMileScaling, "last_mile_scaling" );
INIT_GRA_PROP_BIND( Threadsafe, "thread_safe" );
} }

View file

@ -2955,7 +2955,7 @@
"$(DEPENDENCY_SEARCH_PATH)/include/SDL2", "$(DEPENDENCY_SEARCH_PATH)/include/SDL2",
"$(DEPENDENCY_SEARCH_PATH)/include/pixman-1", "$(DEPENDENCY_SEARCH_PATH)/include/pixman-1",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/arm64-darwin", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/-darwin",
"$(DEPENDENCY_SEARCH_PATH)/include/AL", "$(DEPENDENCY_SEARCH_PATH)/include/AL",
"$(DEPENDENCY_SEARCH_PATH)/include/openssl", "$(DEPENDENCY_SEARCH_PATH)/include/openssl",
"$(DEPENDENCY_SEARCH_PATH)/include/uchardet", "$(DEPENDENCY_SEARCH_PATH)/include/uchardet",
@ -3042,7 +3042,7 @@
"$(DEPENDENCY_SEARCH_PATH)/include/SDL2", "$(DEPENDENCY_SEARCH_PATH)/include/SDL2",
"$(DEPENDENCY_SEARCH_PATH)/include/pixman-1", "$(DEPENDENCY_SEARCH_PATH)/include/pixman-1",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/arm64-darwin", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/-darwin",
"$(DEPENDENCY_SEARCH_PATH)/include/AL", "$(DEPENDENCY_SEARCH_PATH)/include/AL",
"$(DEPENDENCY_SEARCH_PATH)/include/openssl", "$(DEPENDENCY_SEARCH_PATH)/include/openssl",
"$(DEPENDENCY_SEARCH_PATH)/include/uchardet", "$(DEPENDENCY_SEARCH_PATH)/include/uchardet",
@ -3128,7 +3128,7 @@
"$(DEPENDENCY_SEARCH_PATH)/include/SDL2", "$(DEPENDENCY_SEARCH_PATH)/include/SDL2",
"$(DEPENDENCY_SEARCH_PATH)/include/pixman-1", "$(DEPENDENCY_SEARCH_PATH)/include/pixman-1",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/arm64-darwin", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/-darwin",
"$(DEPENDENCY_SEARCH_PATH)/include/AL", "$(DEPENDENCY_SEARCH_PATH)/include/AL",
"$(DEPENDENCY_SEARCH_PATH)/include/uchardet", "$(DEPENDENCY_SEARCH_PATH)/include/uchardet",
"$(DEPENDENCY_SEARCH_PATH)/include/openssl", "$(DEPENDENCY_SEARCH_PATH)/include/openssl",
@ -3209,7 +3209,7 @@
"$(DEPENDENCY_SEARCH_PATH)/include/SDL2", "$(DEPENDENCY_SEARCH_PATH)/include/SDL2",
"$(DEPENDENCY_SEARCH_PATH)/include/pixman-1", "$(DEPENDENCY_SEARCH_PATH)/include/pixman-1",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)",
"$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/arm64-darwin", "$(DEPENDENCY_SEARCH_PATH)/include/ruby-$(MRI_VERSION)/-darwin",
"$(DEPENDENCY_SEARCH_PATH)/include/AL", "$(DEPENDENCY_SEARCH_PATH)/include/AL",
"$(DEPENDENCY_SEARCH_PATH)/include/uchardet", "$(DEPENDENCY_SEARCH_PATH)/include/uchardet",
"$(DEPENDENCY_SEARCH_PATH)/include/openssl", "$(DEPENDENCY_SEARCH_PATH)/include/openssl",

View file

@ -760,6 +760,7 @@ struct GraphicsPrivate {
SDL_mutex *avgFPSLock; SDL_mutex *avgFPSLock;
SDL_mutex *glResourceLock; SDL_mutex *glResourceLock;
bool multithreadedMode;
/* Global list of all live Disposables /* Global list of all live Disposables
* (disposed on reset) */ * (disposed on reset) */
@ -769,9 +770,9 @@ struct GraphicsPrivate {
: scRes(DEF_SCREEN_W, DEF_SCREEN_H), scSize(scRes), : scRes(DEF_SCREEN_W, DEF_SCREEN_H), scSize(scRes),
winSize(rtData->config.defScreenW, rtData->config.defScreenH), winSize(rtData->config.defScreenW, rtData->config.defScreenH),
screen(scRes.x, scRes.y), threadData(rtData), screen(scRes.x, scRes.y), threadData(rtData),
glCtx(SDL_GL_GetCurrentContext()), frameRate(DEF_FRAMERATE), glCtx(SDL_GL_GetCurrentContext()), multithreadedMode(true),
frameCount(0), brightness(255), fpsLimiter(frameRate), frameRate(DEF_FRAMERATE), frameCount(0), brightness(255),
useFrameSkip(rtData->config.frameSkip), frozen(false), fpsLimiter(frameRate), useFrameSkip(rtData->config.frameSkip), frozen(false),
last_update(0), last_avg_update(0), backingScaleFactor(1), integerScaleFactor(0, 0), last_update(0), last_avg_update(0), backingScaleFactor(1), integerScaleFactor(0, 0),
integerScaleActive(rtData->config.integerScaling.active), integerScaleActive(rtData->config.integerScaling.active),
integerLastMileScaling(rtData->config.integerScaling.lastMileScaling) { integerLastMileScaling(rtData->config.integerScaling.lastMileScaling) {
@ -1048,12 +1049,16 @@ struct GraphicsPrivate {
return ret; return ret;
} }
void setLock() { void setLock(bool force = false) {
if (!(force || multithreadedMode)) return;
SDL_LockMutex(glResourceLock); SDL_LockMutex(glResourceLock);
SDL_GL_MakeCurrent(threadData->window, threadData->glContext); SDL_GL_MakeCurrent(threadData->window, threadData->glContext);
} }
void releaseLock() { void releaseLock(bool force = false) {
if (!(force || multithreadedMode)) return;
SDL_UnlockMutex(glResourceLock); SDL_UnlockMutex(glResourceLock);
} }
}; };
@ -1532,6 +1537,16 @@ void Graphics::setLastMileScaling(bool value)
p->updateScreenResoRatio(p->threadData); p->updateScreenResoRatio(p->threadData);
} }
bool Graphics::getThreadsafe() const
{
return p->multithreadedMode;
}
void Graphics::setThreadsafe(bool value)
{
p->multithreadedMode = value;
}
double Graphics::getScale() const { double Graphics::getScale() const {
p->checkResize(); p->checkResize();
return (double)(p->winSize.y / p->backingScaleFactor) / p->scRes.y; return (double)(p->winSize.y / p->backingScaleFactor) / p->scRes.y;
@ -1583,12 +1598,12 @@ void Graphics::repaintWait(const AtomicFlag &exitCond, bool checkReset) {
GLMeta::blitEnd(); GLMeta::blitEnd();
} }
void Graphics::lock() { void Graphics::lock(bool force) {
p->setLock(); p->setLock(force);
} }
void Graphics::unlock() { void Graphics::unlock(bool force) {
p->releaseLock(); p->releaseLock(force);
} }
void Graphics::addDisposable(Disposable *d) { p->dispList.append(d->link); } void Graphics::addDisposable(Disposable *d) { p->dispList.append(d->link); }

View file

@ -77,6 +77,7 @@ public:
DECL_ATTR( SmoothScaling, bool ) DECL_ATTR( SmoothScaling, bool )
DECL_ATTR( IntegerScaling, bool ) DECL_ATTR( IntegerScaling, bool )
DECL_ATTR( LastMileScaling, bool ) DECL_ATTR( LastMileScaling, bool )
DECL_ATTR( Threadsafe, bool )
double averageFrameRate(); double averageFrameRate();
/* <internal> */ /* <internal> */
@ -87,8 +88,8 @@ public:
void repaintWait(const AtomicFlag &exitCond, void repaintWait(const AtomicFlag &exitCond,
bool checkReset = true); bool checkReset = true);
void lock(); void lock(bool force = false);
void unlock(); void unlock(bool force = false);
private: private:
Graphics(RGSSThreadData *data); Graphics(RGSSThreadData *data);