diff options
Diffstat (limited to 'Runtime/GfxDevice/threaded/ThreadedDisplayList.h')
-rw-r--r-- | Runtime/GfxDevice/threaded/ThreadedDisplayList.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/threaded/ThreadedDisplayList.h b/Runtime/GfxDevice/threaded/ThreadedDisplayList.h new file mode 100644 index 0000000..5711f8e --- /dev/null +++ b/Runtime/GfxDevice/threaded/ThreadedDisplayList.h @@ -0,0 +1,85 @@ +#ifndef THREADED_DISPLAY_LIST_H +#define THREADED_DISPLAY_LIST_H + +#if ENABLE_MULTITHREADED_CODE + +#include "Runtime/Threads/ThreadedStreamBuffer.h" +#include "Runtime/GfxDevice/GfxDisplayList.h" +#include "Runtime/GfxDevice/GfxPatchInfo.h" +#include "Runtime/GfxDevice/GpuProgram.h" + +class GfxDeviceClient; + +struct DisplayListContext +{ + DisplayListContext(); + void ClearState(); + void Reset(); + + enum + { + kFogParamsNone = -1, + kFogParamsDisable = -2 + }; + + ThreadedStreamBuffer commandQueue; + GfxPatchInfo patchInfo; + bool recordFailed; + bool hasSetShaders; + bool shadersActive[kShaderTypeCount]; + int fogParamsOffset; +}; + + +class ThreadedDisplayList : public GfxDisplayList +{ +public: + ThreadedDisplayList(const void* data, size_t size, const DisplayListContext& context); + ~ThreadedDisplayList(); + + void Call(); + + UInt8* GetData() { return m_ListData.m_Buffer.begin(); } + const UInt8* GetData() const { return m_ListData.m_Buffer.begin(); } + size_t GetSize() const { return m_ListData.m_Buffer.size(); } + + void Patch(ThreadedStreamBuffer& queue); + +private: + int CopyClientData(int offset, int size); + void UpdateClientDevice(GfxDeviceClient& device); + void DoLockstep(); + + class PatchableData + { + public: + PatchableData(const void* data, size_t size, + const GfxPatchInfo& patchInfo); + PatchableData(); + + void CheckParametersValid(); + void WriteParameters(ThreadedStreamBuffer& queue); + void PatchImmediate(); + void Patch(ThreadedStreamBuffer& queue); + void PatchFloat(const GfxPatch& patch, float* dest); + void PatchVector(const GfxPatch& patch, Vector4f* dest); + void PatchMatrix(const GfxPatch& patch, Matrix4x4f* dest); + void PatchBuffer(const GfxPatch& patch, ComputeBufferID* dest); + void PatchTexEnvProperties(const GfxTexEnvPatch& patch, TexEnvProperties* dest); + void PatchTexEnvMatrix(const GfxTexEnvPatch& patch, Matrix4x4f* dest); + int AppendData(const void* data, int size); + + dynamic_array<UInt8> m_Buffer; + GfxPatchInfo m_PatchInfo; + }; + + PatchableData m_ListData; + PatchableData m_ClientData; + bool m_HasSetShaders; + bool m_ShadersActive[kShaderTypeCount]; + int m_FogParamsOffset; +}; + + +#endif +#endif |