HatchitGraphics
ht_gpuresourcethread.h
1 
15 #pragma once
16 
17 #include <ht_platform.h>
18 #include <ht_string.h>
19 #include <ht_threadvector.h>
20 #include <ht_threadstack.h>
21 #include <ht_threadqueue.h>
22 #include <atomic>
23 #include <thread>
24 #include <mutex>
25 #include <condition_variable>
26 #include <ht_gpuresourcerequest.h>
27 
28 #include <ht_texture_resource.h>
29 #include <ht_material_resource.h>
30 #include <ht_rootlayout_resource.h>
31 #include <ht_pipeline_resource.h>
32 #include <ht_shader_resource.h>
33 #include <ht_renderpass_resource.h>
34 #include <ht_rendertarget_resource.h>
35 #include <ht_mesh_resource.h>
36 #include <ht_model.h>
37 
38 namespace Hatchit
39 {
40  namespace Graphics
41  {
42  class GPUResourceRequest;
43 
53  class HT_API GPUResourceThread
54  {
55  using GPURequestQueue = Core::ThreadsafeStack<GPUResourceRequest*>;
56 
57  public:
58  virtual ~GPUResourceThread() { };
59 
60  virtual void VStart() = 0;
61 
62  bool Locked() const;
63  void Load(GPUResourceRequest* request);
64  void LoadAsync(GPUResourceRequest* request);
65  void Kill();
66 
67  void CreateTexture(std::string file, void** data);
68  void CreateMaterial(std::string file, void** data);
69  void CreateRootLayout(std::string file, void** data);
70  void CreatePipeline(std::string file, void** data);
71  void CreateShader(std::string file, void** data);
72  void CreateRenderPass(std::string file, void** data);
73  void CreateRenderTarget(std::string file, void** data);
74  void CreateMesh(std::string file, void** data);
75 
76  protected:
77  std::thread m_thread;
78  std::atomic_bool m_alive;
79  std::atomic_bool m_tfinished;
80  std::atomic_bool m_locked;
81  mutable std::mutex m_mutex;
82  std::condition_variable m_cv;
83  std::atomic_bool m_processed;
84  GPURequestQueue m_requests;
85 
86  void ProcessTextureRequest(TextureRequest* request);
87  void ProcessMaterialRequest(MaterialRequest* request);
88  void ProcessRootLayoutRequest(RootLayoutRequest* request);
89  void ProcessPipelineRequest(PipelineRequest* request);
90  void ProcessShaderRequest(ShaderRequest* request);
91  void ProcessRenderPassRequest(RenderPassRequest* request);
92  void ProcessRenderTargetRequest(RenderTargetRequest* request);
93  void ProcessMeshRequest(MeshRequest* request);
94 
95  virtual void VCreateTextureBase(Resource::TextureHandle handle, void** base) = 0;
96  virtual void VCreateMaterialBase(Resource::MaterialHandle handle, void** base) = 0;
97  virtual void VCreateRootLayoutBase(Resource::RootLayoutHandle handle, void** base) = 0;
98  virtual void VCreatePipelineBase(Resource::PipelineHandle handle, void** base) = 0;
99  virtual void VCreateShaderBase(Resource::ShaderHandle handle, void** base) = 0;
100  virtual void VCreateRenderPassBase(Resource::RenderPassHandle handle, void** base) = 0;
101  virtual void VCreateRenderTargetBase(Resource::RenderTargetHandle handle, void** base) = 0;
102  virtual void VCreateMeshBase(Resource::ModelHandle handle, void** base) = 0;
103  };
104  }
105 }
Abstract class that defines and implements functions for creation of GPU resource objects...
Definition: ht_gpuresourcethread.h:53
Hatchit Engine Copyright(c) 2015-2016 Third-Degree.
Definition: ht_color.h:19
Definition: ht_gpuresourcerequest.h:55
Definition: ht_gpuresourcerequest.h:34