1 #ifndef COMPOSITOR_RESOURCE_H 2 #define COMPOSITOR_RESOURCE_H 3 4 #include <vulkan/vulkan.h> 5 #include <vulkan/vulkan_xcb.h> 6 7 //struct gbm_bo; 8 9 namespace Compositor{ 10 11 class TextureBase{ 12 public: 13 TextureBase(uint, uint, VkFormat, const VkComponentMapping *, uint, const class CompositorInterface *); 14 virtual ~TextureBase(); 15 // 16 uint w, h; 17 uint flags; 18 uint formatIndex; 19 uint componentMappingHash; 20 VkImageLayout imageLayout; 21 22 VkImage image; 23 VkImageView imageView; 24 VkDeviceMemory deviceMemory; 25 26 const class CompositorInterface *pcomp; 27 GetComponentMappingHash(const VkComponentMapping * pcomponentMapping)28 static inline uint GetComponentMappingHash(const VkComponentMapping *pcomponentMapping){ 29 return pcomponentMapping->r|((uint)pcomponentMapping->g<<8)|((uint)pcomponentMapping->b<<16)|((uint)pcomponentMapping->a<<24); 30 } 31 static const std::vector<std::pair<VkFormat, uint>> formatSizeMap; 32 static const VkComponentMapping defaultComponentMapping; 33 }; 34 35 //texture class for shader reads 36 class TextureStaged : virtual public TextureBase{ 37 public: 38 TextureStaged(uint, uint, VkFormat, const VkComponentMapping *, uint, const class CompositorInterface *); 39 virtual ~TextureStaged(); 40 const void * Map() const; 41 void Unmap(const VkCommandBuffer *, const VkRect2D *, uint); 42 43 VkBuffer stagingBuffer; 44 VkDeviceMemory stagingMemory; 45 46 uint stagingMemorySize; 47 48 std::vector<VkBufferImageCopy> bufferImageCopyBuffer; //to avoid repeated dynamic allocations each time texture is updated in multiple regions 49 }; 50 51 class TexturePixmap : virtual public TextureBase{ 52 public: 53 TexturePixmap(uint, uint, const VkComponentMapping *, uint, const class CompositorInterface *); 54 virtual ~TexturePixmap(); 55 void Attach(xcb_pixmap_t); 56 void Detach(); 57 void Update(const VkCommandBuffer *, const VkRect2D *, uint); 58 59 VkImage transferImage; 60 VkDeviceMemory transferMemory; 61 VkImageLayout transferImageLayout; 62 63 std::vector<VkImageCopy> imageCopyBuffer; 64 65 sint dmafd; 66 //struct gbm_bo *pgbmBufferObject; 67 const class X11Compositor *pcomp11; 68 69 static const VkComponentMapping pixmapComponentMapping; 70 static const VkComponentMapping pixmapComponentMapping24; 71 }; 72 73 class TextureHostPointer : virtual public TextureBase{ 74 public: 75 TextureHostPointer(uint, uint, const VkComponentMapping *, uint, const class CompositorInterface *); 76 virtual ~TextureHostPointer(); 77 bool Attach(unsigned char *); 78 void Detach(uint64); 79 void Update(const VkCommandBuffer *, const VkRect2D *, uint); 80 81 VkBuffer transferBuffer; 82 VkDeviceMemory transferMemory; 83 std::vector<std::tuple<uint64, VkDeviceMemory, VkBuffer>> discards; 84 85 std::vector<VkBufferImageCopy> bufferImageCopyBuffer; 86 }; 87 88 //class Texture : public TextureStaged, public TexturePixmap{ 89 class Texture : public TextureStaged, public TextureHostPointer{ 90 public: 91 Texture(uint, uint, const VkComponentMapping *, uint, const class CompositorInterface *); 92 ~Texture(); 93 }; 94 95 class Buffer{ 96 public: 97 Buffer(uint, VkBufferUsageFlagBits, const class CompositorInterface *); 98 ~Buffer(); 99 const void * Map() const; 100 void Unmap(const VkCommandBuffer *); 101 102 const class CompositorInterface *pcomp; 103 VkBuffer buffer; 104 VkDeviceMemory deviceMemory; 105 106 VkBuffer stagingBuffer; 107 VkDeviceMemory stagingMemory; 108 109 uint stagingMemorySize; 110 uint size; 111 }; 112 113 class ShaderModule{ 114 public: 115 ShaderModule(const char *, const Blob *, const class CompositorInterface *); 116 ~ShaderModule(); 117 118 const class CompositorInterface *pcomp; 119 const char *pname; 120 VkShaderModule shaderModule; 121 VkPushConstantRange *pPushConstantRanges; 122 //VKPushConstantRange pushConstantRange; //only one range can exist 123 VkDescriptorSetLayout *pdescSetLayouts; 124 uint pushConstantBlockCount; 125 uint setCount; 126 //uint inputCount; 127 //uint inputStride; 128 129 struct Binding{ 130 const char *pname; 131 VkDescriptorType type; 132 uint setIndex; 133 uint binding; 134 }; 135 std::vector<Binding> bindings; 136 137 struct Input{ 138 uint location; //index of the input 139 uint binding; 140 //uint offset; //byte offset 141 uint semanticMapIndex; //index to semantic map 142 }; 143 std::vector<Input> inputs; 144 145 struct Variable{ 146 uint offset; 147 uint variableMapIndex; 148 }; 149 std::vector<Variable> variables; 150 151 enum INPUT{ 152 INPUT_POSITION_SFLOAT2, 153 INPUT_POSITION_UINT2, 154 INPUT_TEXCOORD_SFLOAT2, 155 INPUT_TEXCOORD_UINT2, 156 INPUT_COUNT 157 }; 158 static const std::vector<std::tuple<const char *, VkFormat, uint>> semanticMap; 159 enum VARIABLE{ 160 VARIABLE_XY0, 161 VARIABLE_XY1, 162 VARIABLE_TRANSFORM, 163 VARIABLE_SCREEN, 164 VARIABLE_MARGIN, 165 VARIABLE_TITLEPAD, 166 VARIABLE_TITLESPAN, 167 VARIABLE_STACKINDEX, 168 VARIABLE_FLAGS, 169 VARIABLE_TIME, 170 VARIABLE_COUNT 171 }; 172 static const std::vector<std::tuple<const char *, uint>> variableMap; 173 }; 174 175 class Pipeline{ 176 public: 177 Pipeline(ShaderModule *, ShaderModule *, ShaderModule *, const std::vector<std::pair<ShaderModule::INPUT, uint>> *, const VkPipelineInputAssemblyStateCreateInfo *, const VkPipelineRasterizationStateCreateInfo *, const VkPipelineDepthStencilStateCreateInfo *, const VkPipelineColorBlendStateCreateInfo *, const VkPipelineDynamicStateCreateInfo *, const class CompositorInterface *); 178 virtual ~Pipeline(); 179 180 enum SHADER_MODULE{ 181 SHADER_MODULE_VERTEX, 182 SHADER_MODULE_GEOMETRY, 183 SHADER_MODULE_FRAGMENT, 184 SHADER_MODULE_COUNT 185 }; //note: code in Pipeline() relies on this order 186 ShaderModule *pshaderModule[SHADER_MODULE_COUNT]; 187 const class CompositorInterface *pcomp; 188 VkPushConstantRange pushConstantRange; 189 VkPipelineLayout pipelineLayout; 190 VkPipeline pipeline; 191 }; 192 193 class ClientPipeline : public Pipeline{ //, public Desc 194 public: 195 ClientPipeline(ShaderModule *, ShaderModule *, ShaderModule *, const std::vector<std::pair<ShaderModule::INPUT, uint>> *, const class CompositorInterface *); 196 ~ClientPipeline(); 197 static const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo; 198 static const VkPipelineColorBlendAttachmentState colorBlendAttachmentState; 199 static const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo; 200 static const VkDynamicState dynamicStatesScissoring[1]; 201 static const VkPipelineDynamicStateCreateInfo dynamicStateCreateInfo; 202 static const VkPipelineDynamicStateCreateInfo dynamicStateCreateInfoScissoring; 203 static const VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo; 204 }; 205 206 class TextPipeline : public Pipeline{ 207 public: 208 TextPipeline(ShaderModule *, ShaderModule *, ShaderModule *, const std::vector<std::pair<ShaderModule::INPUT, uint>> *, const class CompositorInterface *); 209 ~TextPipeline(); 210 static const VkPipelineInputAssemblyStateCreateInfo inputAssemblyStateCreateInfo; 211 static const VkPipelineColorBlendAttachmentState colorBlendAttachmentState; 212 static const VkPipelineRasterizationStateCreateInfo rasterizationStateCreateInfo; 213 static const VkPipelineColorBlendStateCreateInfo colorBlendStateCreateInfo; 214 }; 215 216 } 217 218 #endif 219 220