2019-04-10 21:54:39 +08:00
|
|
|
|
#ifndef HGL_GRAPH_RENDER_SURFACE_INCLUDE
|
|
|
|
|
#define HGL_GRAPH_RENDER_SURFACE_INCLUDE
|
|
|
|
|
|
|
|
|
|
#include<hgl/type/List.h>
|
2019-04-28 16:06:53 +08:00
|
|
|
|
#include<hgl/type/BaseString.h>
|
|
|
|
|
#include<hgl/type/Map.h>
|
2019-04-10 21:54:39 +08:00
|
|
|
|
#include"VK.h"
|
|
|
|
|
#include"Window.h"
|
2019-04-18 16:06:44 +08:00
|
|
|
|
#include"VKDeviceAttribute.h"
|
2019-04-23 00:02:59 +08:00
|
|
|
|
#include"VKFramebuffer.h"
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
|
|
|
|
VK_NAMESPACE_BEGIN
|
2019-04-18 22:10:24 +08:00
|
|
|
|
struct PhysicalDevice;
|
|
|
|
|
class Buffer;
|
|
|
|
|
class VertexBuffer;
|
2019-04-25 14:10:01 +08:00
|
|
|
|
class IndexBuffer;
|
2019-04-18 22:10:24 +08:00
|
|
|
|
class CommandBuffer;
|
|
|
|
|
class RenderPass;
|
2019-04-19 19:58:01 +08:00
|
|
|
|
class Fence;
|
2019-04-19 20:04:08 +08:00
|
|
|
|
class Semaphore;
|
2019-04-27 21:23:57 +08:00
|
|
|
|
class ShaderModule;
|
2019-04-27 21:49:22 +08:00
|
|
|
|
class ShaderModuleManage;
|
2019-04-28 16:06:53 +08:00
|
|
|
|
class VertexShaderModule;
|
2019-04-25 10:09:56 +08:00
|
|
|
|
class Material;
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-20 16:12:22 +08:00
|
|
|
|
#define MAX_FRAMES_IN_FLIGHT 2
|
|
|
|
|
|
2019-04-18 16:06:44 +08:00
|
|
|
|
class Device
|
2019-04-11 02:29:21 +08:00
|
|
|
|
{
|
2019-04-18 22:24:39 +08:00
|
|
|
|
DeviceAttribute *attr;
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-19 20:10:59 +08:00
|
|
|
|
Semaphore *image_acquired_semaphore;
|
2019-04-20 16:12:22 +08:00
|
|
|
|
Fence *draw_fence;
|
2019-04-23 00:02:59 +08:00
|
|
|
|
|
|
|
|
|
RenderPass *main_rp;
|
|
|
|
|
ObjectList<Framebuffer> main_fb;
|
2019-04-20 16:12:22 +08:00
|
|
|
|
|
|
|
|
|
uint32_t current_frame;
|
2019-04-19 20:10:59 +08:00
|
|
|
|
|
2019-04-19 20:23:14 +08:00
|
|
|
|
VkPresentInfoKHR present;
|
2019-04-28 16:06:53 +08:00
|
|
|
|
|
2019-04-11 02:29:21 +08:00
|
|
|
|
private:
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-18 16:06:44 +08:00
|
|
|
|
friend Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *);
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-19 20:10:59 +08:00
|
|
|
|
Device(DeviceAttribute *da);
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
2019-04-18 22:24:39 +08:00
|
|
|
|
virtual ~Device();
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-23 00:37:45 +08:00
|
|
|
|
operator VkDevice () {return attr->device;}
|
|
|
|
|
|
2019-04-18 22:24:39 +08:00
|
|
|
|
VkSurfaceKHR GetSurface () {return attr->surface;}
|
|
|
|
|
VkDevice GetDevice () {return attr->device;}
|
|
|
|
|
const PhysicalDevice *GetPhysicalDevice ()const {return attr->physical_device;}
|
|
|
|
|
const VkExtent2D & GetExtent ()const {return attr->swapchain_extent;}
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-19 00:46:49 +08:00
|
|
|
|
VkDescriptorPool GetDescriptorPool () {return attr->desc_pool;}
|
2019-04-19 20:40:04 +08:00
|
|
|
|
VkPipelineCache GetPipelineCache () {return attr->pipeline_cache;}
|
2019-04-19 00:46:49 +08:00
|
|
|
|
|
2019-04-20 02:28:57 +08:00
|
|
|
|
public:
|
|
|
|
|
|
2019-04-20 16:12:22 +08:00
|
|
|
|
const uint32_t GetSwapChainImageCount ()const {return attr->sc_image_views.GetCount();}
|
2019-04-22 00:33:48 +08:00
|
|
|
|
ImageView *GetColorImageView (int index) {return attr->sc_image_views[index];}
|
|
|
|
|
ImageView *GetDepthImageView () {return attr->depth.view;}
|
2019-04-20 16:12:22 +08:00
|
|
|
|
|
|
|
|
|
const uint32_t GetCurrentFrameIndices () {return current_frame;}
|
2019-04-20 02:28:57 +08:00
|
|
|
|
|
2019-04-23 00:02:59 +08:00
|
|
|
|
RenderPass * GetRenderPass () {return main_rp;}
|
|
|
|
|
Framebuffer * GetFramebuffer (int index) {return main_fb[index];}
|
|
|
|
|
|
2019-04-27 21:49:22 +08:00
|
|
|
|
public: //Buffer<65><72><EFBFBD><EFBFBD>
|
2019-04-10 21:54:39 +08:00
|
|
|
|
|
2019-04-25 14:33:50 +08:00
|
|
|
|
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
|
|
|
|
|
Buffer * CreateBuffer(VkBufferUsageFlags buf_usage,VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(buf_usage,size,nullptr,sharing_mode);}
|
2019-04-25 14:10:01 +08:00
|
|
|
|
|
2019-04-25 14:33:50 +08:00
|
|
|
|
VertexBuffer * CreateVBO(VkFormat format,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
|
|
|
|
|
VertexBuffer * CreateVBO(VkFormat format,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateVBO(format,count,nullptr,sharing_mode);}
|
2019-04-16 02:21:35 +08:00
|
|
|
|
|
2019-04-25 14:33:50 +08:00
|
|
|
|
IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE);
|
|
|
|
|
IndexBuffer * CreateIBO16(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,data,sharing_mode);}
|
|
|
|
|
IndexBuffer * CreateIBO32(uint32_t count,const void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,data,sharing_mode);}
|
2019-04-11 22:40:13 +08:00
|
|
|
|
|
2019-04-25 14:33:50 +08:00
|
|
|
|
IndexBuffer * CreateIBO(VkIndexType index_type,uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(index_type,count,nullptr,sharing_mode);}
|
|
|
|
|
IndexBuffer * CreateIBO16(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT16,count,nullptr,sharing_mode);}
|
|
|
|
|
IndexBuffer * CreateIBO32(uint32_t count,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateIBO(VK_INDEX_TYPE_UINT32,count,nullptr,sharing_mode);}
|
|
|
|
|
|
|
|
|
|
#define CREATE_BUFFER_OBJECT(LargeName,type) Buffer *Create##LargeName(VkDeviceSize size,void *data,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,data,sharing_mode);} \
|
|
|
|
|
Buffer *Create##LargeName(VkDeviceSize size,VkSharingMode sharing_mode=VK_SHARING_MODE_EXCLUSIVE){return CreateBuffer(VK_BUFFER_USAGE_##type##_BUFFER_BIT,size,nullptr,sharing_mode);}
|
2019-04-11 23:02:38 +08:00
|
|
|
|
|
|
|
|
|
CREATE_BUFFER_OBJECT(UBO,UNIFORM)
|
2019-04-19 21:14:56 +08:00
|
|
|
|
CREATE_BUFFER_OBJECT(SSBO,STORAGE)
|
2019-04-11 23:02:38 +08:00
|
|
|
|
CREATE_BUFFER_OBJECT(INBO,INDIRECT)
|
|
|
|
|
|
|
|
|
|
#undef CREATE_BUFFER_OBJECT
|
2019-04-11 22:40:13 +08:00
|
|
|
|
|
2019-04-27 21:49:22 +08:00
|
|
|
|
public: //material<61><6C><EFBFBD><EFBFBD>
|
|
|
|
|
|
2019-04-28 16:06:53 +08:00
|
|
|
|
ShaderModuleManage *CreateShaderModuleManage();
|
2019-04-27 21:23:57 +08:00
|
|
|
|
|
2019-04-27 21:49:22 +08:00
|
|
|
|
public: //Command Buffer <20><><EFBFBD><EFBFBD>
|
2019-04-25 10:09:56 +08:00
|
|
|
|
|
2019-04-19 21:02:41 +08:00
|
|
|
|
CommandBuffer * CreateCommandBuffer();
|
2019-04-22 00:33:48 +08:00
|
|
|
|
RenderPass * CreateRenderPass(VkFormat color_format,VkFormat depth_format);
|
2019-04-19 21:02:41 +08:00
|
|
|
|
Fence * CreateFence();
|
|
|
|
|
Semaphore * CreateSem();
|
|
|
|
|
|
2019-04-27 21:49:22 +08:00
|
|
|
|
public: //<2F>ύ<EFBFBD><E1BDBB><EFBFBD><EFBFBD>
|
|
|
|
|
|
2019-04-19 21:02:41 +08:00
|
|
|
|
bool AcquireNextImage ();
|
2019-04-20 16:12:22 +08:00
|
|
|
|
bool QueueSubmit (CommandBuffer *);
|
|
|
|
|
bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1);
|
2019-04-19 21:02:41 +08:00
|
|
|
|
bool QueuePresent ();
|
2019-04-18 16:06:44 +08:00
|
|
|
|
};//class Device
|
2019-04-10 21:54:39 +08:00
|
|
|
|
VK_NAMESPACE_END
|
|
|
|
|
#endif//HGL_GRAPH_RENDER_SURFACE_INCLUDE
|