From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/GfxDevice/threaded/GfxDeviceWorker.h | 135 +++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 Runtime/GfxDevice/threaded/GfxDeviceWorker.h (limited to 'Runtime/GfxDevice/threaded/GfxDeviceWorker.h') diff --git a/Runtime/GfxDevice/threaded/GfxDeviceWorker.h b/Runtime/GfxDevice/threaded/GfxDeviceWorker.h new file mode 100644 index 0000000..4129917 --- /dev/null +++ b/Runtime/GfxDevice/threaded/GfxDeviceWorker.h @@ -0,0 +1,135 @@ +#pragma once +#if ENABLE_MULTITHREADED_CODE + +#include "Runtime/GfxDevice/GfxDevice.h" +#include "Runtime/GfxDevice/threaded/WorkerIDMapper.h" +#include "Runtime/Utilities/dynamic_array.h" +#include "Runtime/Shaders/VBO.h" +#include "Runtime/Threads/Mutex.h" +#include "Runtime/Threads/Semaphore.h" +#include "Runtime/Threads/JobScheduler.h" +#include "External/shaderlab/Library/TextureBinding.h" +#include "Runtime/Filters/Mesh/MeshSkinning.h" +#include + + +#define GFXDEVICE_USE_CACHED_STATE 0 +#define DEBUG_GFXDEVICE_LOCKSTEP 0 + +#if DEBUG_GFXDEVICE_LOCKSTEP + #define GFXDEVICE_LOCKSTEP_CLIENT() { DoLockstep(); } + #define GFXDEVICE_LOCKSTEP_WORKER() { DoLockstep(pos, cmd); } +#else + #define GFXDEVICE_LOCKSTEP_CLIENT() + #define GFXDEVICE_LOCKSTEP_WORKER() +#endif + +struct ClientDeviceTimerQuery; +class ThreadedStreamBuffer; +class ThreadedDisplayList; +class Thread; + +class GfxDeviceWorker : public NonCopyable +{ +public: + GfxDeviceWorker(int maxCallDepth, ThreadedStreamBuffer* commandQueue); + ~GfxDeviceWorker(); + + GfxThreadableDevice* Startup(GfxDeviceRenderer renderer, bool threaded, bool forceRef); + + void WaitForSignal(); + void LockstepWait(); + + void GetLastFrameStats(GfxDeviceStats& stats); + + void CallImmediate(ThreadedDisplayList* dlist); + + enum EventType + { + kEventTypePresent, + kEventTypeTimerQueries, + kEventTypeCount + }; + + void WaitForEvent(EventType type); + + void WaitOnCPUFence(UInt32 fence); + + bool DidPresentFrame(UInt32 frameID) const; + + bool RunCommandIfDataIsAvailable(); + +private: + void SignalEvent(EventType type); + + static void* RunGfxDeviceWorker(void *data); + + void Run(); + void RunCommand(ThreadedStreamBuffer& stream); + void Signal(); + void DoLockstep(int pos, int cmd); + + UInt8* ReadBufferData(ThreadedStreamBuffer& stream, int size); + void WritebackData(ThreadedStreamBuffer& stream, const void* data, int size); + +#if ENABLE_PROFILER + void PollTimerQueries(); + bool PollNextTimerQuery(bool wait); +#endif + +#if GFXDEVICE_USE_CACHED_STATE + struct CachedState + { + CachedState(); + NormalizationMode normalization; + int backface; + Vector4f ambient; + int fogEnabled; + GfxFogParams fogParams; + }; +#endif + + int m_CallDepth; + int m_MaxCallDepth; + Thread* m_WorkerThread; + ThreadedStreamBuffer* m_CommandQueue; + ThreadedStreamBuffer* m_MainCommandQueue; + ThreadedStreamBuffer* m_PlaybackCommandQueues; + ThreadedDisplayList** m_PlaybackDisplayLists; + dynamic_array m_TempBuffer; + dynamic_array m_ActiveSkins; + dynamic_array m_MappedSkinVBOs; + JobScheduler::JobGroupID m_SkinJobGroup; + Semaphore m_EventSemaphores[kEventTypeCount]; + Semaphore m_LockstepSemaphore; + Semaphore m_WaitSemaphore; + volatile UInt32 m_CurrentCPUFence; + volatile UInt32 m_PresentFrameID; + Mutex m_StatsMutex; + GfxDeviceStats m_FrameStats; + GfxThreadableDevice* m_Device; + bool m_IsThreadOwner; + bool m_Quit; +#if GFXDEVICE_USE_CACHED_STATE + CachedState m_Cached; +#endif +#if ENABLE_PROFILER + // Timer queries for GPU profiling + typedef std::deque TimerQueryList; + TimerQueryList m_PolledTimerQueries; +#endif +#if ENABLE_GFXDEVICE_REMOTE_PROCESS + WorkerIDMapper m_BlendStateMapper; + WorkerIDMapper m_DepthStateMapper; + WorkerIDMapper m_StencilStateMapper; + WorkerIDMapper m_RasterStateMapper; + WorkerIDMapper m_VBOMapper; + WorkerIDMapper m_TextureCombinerMapper; + WorkerIDMapper m_RenderSurfaceMapper; + WorkerIDMapper m_GpuProgramParametersMapper; + WorkerIDMapper m_GpuProgramMapper; + ClientIDMapper m_GpuProgramClientMapper; +#endif +}; + +#endif -- cgit v1.1-26-g67d0