diff options
Diffstat (limited to 'source/libs')
16 files changed, 218 insertions, 70 deletions
diff --git a/source/libs/asura-lib-core/graphics/image_data.cpp b/source/libs/asura-lib-core/graphics/image_data.cpp index 28c706a..b79dfab 100644 --- a/source/libs/asura-lib-core/graphics/image_data.cpp +++ b/source/libs/asura-lib-core/graphics/image_data.cpp @@ -16,7 +16,7 @@ namespace AsuraEngine new STBDecoder() // jpeg, tga, bmp }; - ImageData::ImageData(const Filesystem::DataBuffer& buffer) + ImageData::ImageData(const IO::DataBuffer& buffer) : DecodedData(buffer) { } @@ -30,7 +30,7 @@ namespace AsuraEngine /// /// ɹ׳쳣 /// - void ImageData::Decode(const Filesystem::DataBuffer& buffer) + void ImageData::Decode(const IO::DataBuffer& buffer) { for (ImageDecoder* decoder : ImageDecoders) { diff --git a/source/libs/asura-lib-core/graphics/image_data.h b/source/libs/asura-lib-core/graphics/image_data.h index 53a9e85..820e276 100644 --- a/source/libs/asura-lib-core/graphics/image_data.h +++ b/source/libs/asura-lib-core/graphics/image_data.h @@ -4,8 +4,9 @@ #include <list> #include <asura-lib-utils/scripting/portable.hpp> -#include <asura-lib-utils/filesystem/decoded_data.h> -#include <asura-lib-utils/filesystem/data_buffer.h> +#include <asura-lib-utils/io/decoded_data.h> +#include <asura-lib-utils/io/data_buffer.h> +#include <asura-lib-utils/threading/thread.h> #include "pixel_format.h" #include "color.h" @@ -18,17 +19,22 @@ namespace AsuraEngine class ImageDecoder; class ImageData ASURA_FINAL - : public Filesystem::DecodedData + : public AEIO::DecodedData , public Scripting::Portable<ImageData> { public: + LUAX_DECL_FACTORY(ImageData); + /// /// ͼƬļϢʧܣ׳쳣 /// - ImageData(const Filesystem::DataBuffer& buffer); + ImageData(const AEIO::DataBuffer& buffer); ~ImageData(); + void Load(const AEIO::DataBuffer& buffer); + void LoadAsync(const AEIO::DataBuffer& buffer, AEThreading::Thread* thread); + Color GetPixel(uint x, uint y); uint width, height; @@ -38,17 +44,13 @@ namespace AsuraEngine private: - void Decode(const Filesystem::DataBuffer& buffer) override; + void Decode(const AEIO::DataBuffer& buffer) override; /// /// ڵһimage dataʱṩdecoderڼdecodersмѡԡ /// static std::list<ImageDecoder*> ImageDecoders; - public: - - LUAX_DECL_FACTORY(ImageData); - LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_GetPixel); LUAX_DECL_METHOD(_GetSize); @@ -61,4 +63,6 @@ namespace AsuraEngine } } +namespace AEGraphics = AsuraEngine::Graphics; + #endif
\ No newline at end of file diff --git a/source/libs/asura-lib-utils/io/io_task.cpp b/source/libs/asura-lib-utils/io/io_task.cpp index a96c293..1a50e56 100644 --- a/source/libs/asura-lib-utils/io/io_task.cpp +++ b/source/libs/asura-lib-utils/io/io_task.cpp @@ -1,5 +1,8 @@ #include "io_task.h" +using namespace AEScripting; +using namespace Luax; + namespace AsuraEngine { namespace IO @@ -20,9 +23,17 @@ namespace AsuraEngine return true; } - void IOTask::Invoke() + void IOTask::Invoke(lua_State* thread) { - + if (mCallback) + { + LuaxScopedState state(thread); + if (PushLuaxMemberRef(state, mCallback)) + { + PushLuaxMemberRef(state, mDstRef); + state.Call(1, 0); + } + } } } diff --git a/source/libs/asura-lib-utils/io/io_task.h b/source/libs/asura-lib-utils/io/io_task.h index aa5b38e..a79b2a8 100644 --- a/source/libs/asura-lib-utils/io/io_task.h +++ b/source/libs/asura-lib-utils/io/io_task.h @@ -4,7 +4,7 @@ #include <string> #include "../scripting/portable.hpp" -#include "../threading/thread_task.h" +#include "../threading/task.h" #include "data_buffer.h" @@ -18,7 +18,7 @@ namespace AsuraEngine /// class IOTask ASURA_FINAL : public AEScripting::Portable<IOTask> - , public AEThreading::ThreadTask + , public AEThreading::Task { public: @@ -28,13 +28,13 @@ namespace AsuraEngine ~IOTask(); bool Execute() override ; - void Invoke() override; + void Invoke(lua_State* thread) override; private: std::string mPath; - DataBuffer* mDst; + DataBuffer* mDst; Luax::LuaxMemberRef mDstRef; LUAX_DECL_METHOD(_New); diff --git a/source/libs/asura-lib-utils/scripting/lua_env.h b/source/libs/asura-lib-utils/scripting/lua_env.h new file mode 100644 index 0000000..a467479 --- /dev/null +++ b/source/libs/asura-lib-utils/scripting/lua_env.h @@ -0,0 +1,56 @@ +#ifndef __ASURA_LUA_ENV_H__ +#define __ASURA_LUA_ENV_H__ + +extern "C" +{ +#include <Lua51/lua.h> +#include <Lua51/lauxlib.h> +} +#include <Luax/luax.h> + +#include "../singleton.hpp" + +namespace AsuraEngine +{ + namespace Scripting + { + + /// + /// ͨӿڷlua state + /// + class LuaEnv ASURA_FINAL : public Singleton<LuaEnv> + { + public: + + LuaEnv() : mMainState(0){}; + ~LuaEnv() {}; + + /// + /// ִջ + /// + inline void Init(lua_State* L) { ASSERT(!mMainState); mMainState = L; }; + + inline lua_State* GetMainState() { return mMainState; }; + + private: + + /// + /// ̱߳һluaһAsuraԶֻһִ붼УֻһΡ + /// ߳\ִջӦglobal_Stateģ + /// + /// struct lua_State *mainthread; + /// + /// ʹlua_newstate()ᴴһһglobal_Stateṹһ߳lua_Stateء + /// global_State̹߳˵һ߳lua_newstate()⣬߳lua_newthread() + /// + /// + lua_State* mMainState; + + }; + + } +} + +namespace AEScripting = AsuraEngine::Scripting; + +#endif
\ No newline at end of file diff --git a/source/libs/asura-lib-utils/scripting/portable.hpp b/source/libs/asura-lib-utils/scripting/portable.hpp index 097a9fe..5badf8d 100644 --- a/source/libs/asura-lib-utils/scripting/portable.hpp +++ b/source/libs/asura-lib-utils/scripting/portable.hpp @@ -3,12 +3,7 @@ #include "../type.h" -extern "C" -{ - #include <Lua51/lua.h> - #include <Lua51/lauxlib.h> -} -#include <Luax/luax.h> +#include "lua_env.h" namespace AsuraEngine { diff --git a/source/libs/asura-lib-utils/threading/binding/_thread.cpp b/source/libs/asura-lib-utils/threading/binding/_thread.cpp index 9f6d228..00252a9 100644 --- a/source/libs/asura-lib-utils/threading/binding/_thread.cpp +++ b/source/libs/asura-lib-utils/threading/binding/_thread.cpp @@ -1,4 +1,5 @@ #include "../thread.h" +#include "../task.h" using namespace std; @@ -33,7 +34,7 @@ namespace AsuraEngine cc8* name = state.GetValue<cc8*>(1, ""); - Thread* thread = new Thread(name); + Thread* thread = new Thread(state, name); thread->PushLuaxUserdata(state); return 1; @@ -63,14 +64,14 @@ namespace AsuraEngine return 0; } - // successed = thread:AddTask(thread_task) + // successed = thread:AddTask(task) LUAX_IMPL_METHOD(Thread, _AddTask) { LUAX_PREPARE(L, Thread); - ThreadTask* task = state.GetUserdata<ThreadTask>(2); + Task* task = state.GetUserdata<Task>(2); self->AddTask(task); - self->LuaxRetain<ThreadTask>(state, task); + self->LuaxRetain<Task>(state, task); return 0; } diff --git a/source/libs/asura-lib-utils/threading/coroutine.cpp b/source/libs/asura-lib-utils/threading/coroutine.cpp index e69de29..9f65c5f 100644 --- a/source/libs/asura-lib-utils/threading/coroutine.cpp +++ b/source/libs/asura-lib-utils/threading/coroutine.cpp @@ -0,0 +1,16 @@ +#include "coroutine.h" + +namespace AsuraEngine +{ + namespace Threading + { +/* + Coroutine::Coroutine() + { + + } +*/ + + + } +} diff --git a/source/libs/asura-lib-utils/threading/coroutine.h b/source/libs/asura-lib-utils/threading/coroutine.h index 75d9a10..01af654 100644 --- a/source/libs/asura-lib-utils/threading/coroutine.h +++ b/source/libs/asura-lib-utils/threading/coroutine.h @@ -1,7 +1,7 @@ #ifndef __ASURA_COROUTINE_H__ #define __ASURA_COROUTINE_H__ -#include <asura-lib-utils/scripting/portable.hpp> +#include "../scripting/portable.hpp" namespace AsuraEngine { @@ -18,8 +18,15 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Coroutine); + + private: + /// + /// ǰЭ̵state + /// + lua_State* mThreadState; + LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_Run); diff --git a/source/libs/asura-lib-utils/threading/mutex.cpp b/source/libs/asura-lib-utils/threading/mutex.cpp index e0b6e1e..663ac28 100644 --- a/source/libs/asura-lib-utils/threading/mutex.cpp +++ b/source/libs/asura-lib-utils/threading/mutex.cpp @@ -23,8 +23,11 @@ namespace AsuraEngine Mutex::Mutex() : mImpl(nullptr) { -#if ASURA_THREAD_WIN32 - try_create_mutex(MutexImplWin32); +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + try_create_mutex(MutexImplWin32_CS); +#endif +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + try_create_mutex(MutexImplWin32_KM); #endif ASSERT(mImpl); } @@ -48,34 +51,56 @@ namespace AsuraEngine mImpl->Unlock(); } -#if ASURA_THREAD_WIN32 - MutexImplWin32::MutexImplWin32() +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + + MutexImplWin32_CS::MutexImplWin32_CS() { - //mHandle = ::CreateMutex(NULL, FALSE, NULL); - //if (!mHandle) - // throw Exception("Cant use win32 mutex."); ::InitializeCriticalSection(&mMutex); } - MutexImplWin32::~MutexImplWin32() + MutexImplWin32_CS::~MutexImplWin32_CS() { - //::CloseHandle(mHandle); - //mHandle = NULL; ::DeleteCriticalSection(&mMutex); } - void MutexImplWin32::Lock() + void MutexImplWin32_CS::Lock() { - //::WaitForSingleObject(mHandle, INFINITE); ::EnterCriticalSection(&mMutex); } - void MutexImplWin32::Unlock() + void MutexImplWin32_CS::Unlock() { - //::ReleaseMutex(mHandle); ::LeaveCriticalSection(&mMutex); } -#endif // ASURA_THREAD_WIN32 + +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + MutexImplWin32_KM::MutexImplWin32_KM() + { + mHandle = ::CreateMutex(NULL, FALSE, NULL); + if (!mHandle) + throw Exception("Cant use win32 mutex."); + } + + MutexImplWin32_KM::~MutexImplWin32_KM() + { + ::CloseHandle(mHandle); + mHandle = NULL; + } + + void MutexImplWin32_KM::Lock() + { + ::WaitForSingleObject(mHandle, INFINITE); + } + + void MutexImplWin32_KM::Unlock() + { + ::ReleaseMutex(mHandle); + } + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX } } diff --git a/source/libs/asura-lib-utils/threading/mutex.h b/source/libs/asura-lib-utils/threading/mutex.h index 5ed45ae..51fe63e 100644 --- a/source/libs/asura-lib-utils/threading/mutex.h +++ b/source/libs/asura-lib-utils/threading/mutex.h @@ -49,6 +49,7 @@ namespace AsuraEngine Mutex& m; }; +// ڵջӴλÿʼջΪٽ #define lock(mutex) Lock _asura_scoped_lock_0x0_(mutex) #define lock2(mutex) Lock _asura_scoped_lock_0x1_(mutex) #define lock3(mutex) Lock _asura_scoped_lock_0x2_(mutex) @@ -67,27 +68,47 @@ namespace AsuraEngine }; -#if ASURA_THREAD_WIN32 +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION //https://blog.csdn.net/l799623787/article/details/18259949 - class MutexImplWin32 ASURA_FINAL : public MutexImpl + class MutexImplWin32_CS ASURA_FINAL : public MutexImpl { public: - MutexImplWin32(); - ~MutexImplWin32(); + MutexImplWin32_CS(); + ~MutexImplWin32_CS(); void Lock() override; void Unlock() override; - private: + private: //HANDLE mHandle; CRITICAL_SECTION mMutex; }; -#endif // ASURA_THREAD_WIN32 +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + class MutexImplWin32_KM ASURA_FINAL : public MutexImpl + { + public: + + MutexImplWin32_KM(); + ~MutexImplWin32_KM(); + + void Lock() override; + void Unlock() override; + + private: + + HANDLE mHandle; + + }; + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX #if ASURA_THREAD_STD diff --git a/source/libs/asura-lib-utils/threading/thread_task.cpp b/source/libs/asura-lib-utils/threading/task.cpp index e69de29..e69de29 100644 --- a/source/libs/asura-lib-utils/threading/thread_task.cpp +++ b/source/libs/asura-lib-utils/threading/task.cpp diff --git a/source/libs/asura-lib-utils/threading/thread_task.h b/source/libs/asura-lib-utils/threading/task.h index 1ea0a1a..9f78860 100644 --- a/source/libs/asura-lib-utils/threading/thread_task.h +++ b/source/libs/asura-lib-utils/threading/task.h @@ -12,13 +12,13 @@ namespace AsuraEngine /// /// ϣһ̴̳߳TaskдExecute /// - ASURA_ABSTRACT class ThreadTask + ASURA_ABSTRACT class Task : virtual public AEScripting::NativeAccessor { public: - ThreadTask(); - virtual ~ThreadTask(); + Task(); + virtual ~Task(); /// /// ִɺtrueûص @@ -28,7 +28,7 @@ namespace AsuraEngine /// /// ûص /// - virtual void Invoke() = 0; + virtual void Invoke(lua_State* thread) = 0; protected: diff --git a/source/libs/asura-lib-utils/threading/thread.cpp b/source/libs/asura-lib-utils/threading/thread.cpp index d1b055d..51738de 100644 --- a/source/libs/asura-lib-utils/threading/thread.cpp +++ b/source/libs/asura-lib-utils/threading/thread.cpp @@ -10,9 +10,12 @@ namespace AsuraEngine namespace Threading { - Thread::Thread(const std::string& name) + Thread::Thread(Luax::LuaxState& father, const std::string& name) : mName(name) { + mState = lua_newthread(father); + SetLuaxMemberRef(father, mStateRef, -1); + lua_pop(father, 1); // mState } Thread::~Thread() @@ -31,8 +34,9 @@ namespace AsuraEngine } \ } - bool Thread::AddTask(ThreadTask* task) + bool Thread::AddTask(Task* task) { + lock(mMutex); mTaskQueue.push(task); return true; } @@ -43,30 +47,30 @@ namespace AsuraEngine try_start_thread(ThreadImplWin32); #endif - assert(mImpl); + ASSERT(mImpl); } void Thread::Join() { - assert(mImpl); + ASSERT(mImpl); mImpl->Join(); } void Thread::Kill() { - assert(mImpl); + ASSERT(mImpl); mImpl->Kill(); } bool Thread::IsRunning() { - assert(mImpl); + ASSERT(mImpl); return mImpl->IsRunning(); } bool Thread::IsCurrent() { - assert(mImpl); + ASSERT(mImpl); return mImpl->IsCurrent(); } @@ -79,9 +83,9 @@ namespace AsuraEngine { while (!mTaskQueue.empty()) { - ThreadTask* task = mTaskQueue.front(); + Task* task = mTaskQueue.front(); if (task->Execute()) - task->Invoke(); + task->Invoke(mState); mMutex.Lock(); mTaskQueue.pop(); diff --git a/source/libs/asura-lib-utils/threading/thread.h b/source/libs/asura-lib-utils/threading/thread.h index 24b549c..1bd5f15 100644 --- a/source/libs/asura-lib-utils/threading/thread.h +++ b/source/libs/asura-lib-utils/threading/thread.h @@ -6,7 +6,7 @@ #include <asura-lib-utils/scripting/portable.hpp> -#include "thread_task.h" +#include "task.h" #include "mutex.h" namespace AsuraEngine @@ -26,10 +26,10 @@ namespace AsuraEngine LUAX_DECL_FACTORY(Thread); - Thread(const std::string& name = ""); + Thread(Luax::LuaxState& father, const std::string& name = ""); ~Thread(); - bool AddTask(ThreadTask* task); + bool AddTask(Task* task); void Start(uint32 stacksize = 0); @@ -66,15 +66,20 @@ namespace AsuraEngine LUAX_DECL_METHOD(_IsCurrent); LUAX_DECL_METHOD(_GetName); + ThreadImpl* mImpl; + std::string mName; + /// /// С /// - std::queue<ThreadTask*> mTaskQueue; - - Mutex mMutex; + std::queue<Task*> mTaskQueue; + Mutex mMutex; - ThreadImpl* mImpl; - std::string mName; + /// + /// ̵߳luaִջΪ˱ִջͻ + /// + lua_State* mState; + Luax::LuaxMemberRef mStateRef; }; diff --git a/source/libs/asura-lib-utils/utils_config.h b/source/libs/asura-lib-utils/utils_config.h index d5208d5..02837dc 100644 --- a/source/libs/asura-lib-utils/utils_config.h +++ b/source/libs/asura-lib-utils/utils_config.h @@ -4,4 +4,7 @@ #define ASURA_THREAD_WIN32 1 #define ASURA_THREAD_STD 1 +#define ASURA_MUTEX_WIN32_CRITICLE_SECTION 1 +#define ASURA_MUTEX_WIN32_KERNAL_MUTEX 1 + #endif
\ No newline at end of file |