summaryrefslogtreecommitdiff
path: root/Runtime/GfxDevice/threaded/GfxDeviceWorker.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/GfxDevice/threaded/GfxDeviceWorker.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/GfxDevice/threaded/GfxDeviceWorker.h')
-rw-r--r--Runtime/GfxDevice/threaded/GfxDeviceWorker.h135
1 files changed, 135 insertions, 0 deletions
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 <deque>
+
+
+#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<UInt8> m_TempBuffer;
+ dynamic_array<SkinMeshInfo> m_ActiveSkins;
+ dynamic_array<VBO*> 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<ClientDeviceTimerQuery*> TimerQueryList;
+ TimerQueryList m_PolledTimerQueries;
+#endif
+#if ENABLE_GFXDEVICE_REMOTE_PROCESS
+ WorkerIDMapper<DeviceBlendState> m_BlendStateMapper;
+ WorkerIDMapper<DeviceDepthState> m_DepthStateMapper;
+ WorkerIDMapper<DeviceStencilState> m_StencilStateMapper;
+ WorkerIDMapper<DeviceRasterState> m_RasterStateMapper;
+ WorkerIDMapper<VBO> m_VBOMapper;
+ WorkerIDMapper<void> m_TextureCombinerMapper;
+ WorkerIDMapper<void> m_RenderSurfaceMapper;
+ WorkerIDMapper<GpuProgramParameters> m_GpuProgramParametersMapper;
+ WorkerIDMapper<GpuProgram> m_GpuProgramMapper;
+ ClientIDMapper m_GpuProgramClientMapper;
+#endif
+};
+
+#endif