diff options
author | Chris Robinson <[email protected]> | 2017-06-28 21:54:44 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2017-06-28 21:54:44 -0700 |
commit | a729007887d771ee927da1ef1bc832502e17b2a1 (patch) | |
tree | 26099530cff44742030596f99c89869a2c46bb94 | |
parent | 323162c49f6c474c211b7f27a720300473f1e75f (diff) |
Implement setting a context current in the router
-rw-r--r-- | router/alc.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/router/alc.c b/router/alc.c index 03a42dff..704aa146 100644 --- a/router/alc.c +++ b/router/alc.c @@ -398,7 +398,36 @@ ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCin ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context) { - return ALC_FALSE; + ALint idx = -1; + + if(context) + { + idx = LookupPtrIntMapKey(&ContextIfaceMap, context); + if(idx < 0) + { + ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT); + return ALC_FALSE; + } + if(!DriverList[idx].alcMakeContextCurrent(context)) + return ALC_FALSE; + } + + /* Unset the context from the old driver if it's different from the new + * current one. + */ + if(idx < 0) + { + DriverIface *oldiface = ATOMIC_EXCHANGE_PTR_SEQ(&CurrentCtxDriver, NULL); + if(oldiface) oldiface->alcMakeContextCurrent(NULL); + } + else + { + DriverIface *oldiface = ATOMIC_EXCHANGE_PTR_SEQ(&CurrentCtxDriver, &DriverList[idx]); + if(oldiface && oldiface != &DriverList[idx]) + oldiface->alcMakeContextCurrent(NULL); + } + + return ALC_TRUE; } ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context) @@ -439,7 +468,8 @@ ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context) ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void) { - return NULL; + DriverIface *iface = ATOMIC_LOAD_SEQ(&CurrentCtxDriver); + return iface ? iface->alcGetCurrentContext() : NULL; } ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context) |