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