1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Bad
static int CreateUniformDescription(VkDescriptorPool* pDescPool, VkDescriptorSetLayout* pDescLayout, VkDescriptorSet* pDescSet,
	VkDeviceMemory* pDevMemory, VkBuffer* pUniBuffer)
{
	// Setup Layout Binding for the Uniform buffer that contains "camera"
	VkDescriptorSetLayoutBinding layoutBinding = {};
	layoutBinding.binding = 0;
	layoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
	layoutBinding.descriptorCount = 1;
	layoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;

	// Setup the Description Layout Info
	VkDescriptorSetLayoutCreateInfo descLayoutInfo = {};
	descLayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
	descLayoutInfo.pBindings = &layoutBinding;
	descLayoutInfo.bindingCount = 1;

	// Create Description Layout
	VkDescriptorSetLayout descLayout = {};
	VkResult res = vkCreateDescriptorSetLayout(_VkSystem.device, &descLayoutInfo, 0, &descLayout);
	if (res != VK_SUCCESS)
		return 1;

	// Setup Descriptor Pool Size
	VkDescriptorPoolSize descPoolSize = {};
	descPoolSize.descriptorCount = 1;
	descPoolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;

	// Setup Descriptor Pool Info
	VkDescriptorPoolCreateInfo descPoolInfo = {};
	descPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
	descPoolInfo.maxSets = 1;
	descPoolInfo.poolSizeCount = 1;
	descPoolInfo.pPoolSizes = &descPoolSize;

	// Create Descriptor Pool
	VkDescriptorPool descPool = {};
	res = vkCreateDescriptorPool(_VkSystem.device, &descPoolInfo, 0, &descPool);
	if (res != VK_SUCCESS)
		return 1;

	// Setup Descriptor Allocate Info
	VkDescriptorSetAllocateInfo allocInfo = {};
	allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
	allocInfo.descriptorPool = descPool;
	allocInfo.pSetLayouts = &descLayout;
	allocInfo.descriptorSetCount = 1;

	// Allocate Descriptor set/s
	VkDescriptorSet descSet = {};
	res = vkAllocateDescriptorSets(_VkSystem.device, &allocInfo, &descSet);
	if (res != VK_SUCCESS)
		return 1;

	// Create some random big buffer for the Uniform block
	int uniBlockSize = sizeof(float) * 2; // vec2
	VkDeviceMemory devMemory2;
	VkBuffer uniBuffer;
	CreateBuffer(uniBlockSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, &uniBuffer, &devMemory2);

	VkMappedMemoryRange range;

	void* pBuffer;
	vkMapMemory(_VkSystem.device, devMemory2, 0, uniBlockSize, 0, &pBuffer);

	((float*)pBuffer)[0] = 0.1f; // x
	((float*)pBuffer)[1] = 0.5f; // y

	vkUnmapMemory(_VkSystem.device, devMemory2);

	// Setup Descriptor Buffer Info
	VkDescriptorBufferInfo bufferInfo = {};
	bufferInfo.buffer = uniBuffer;
	bufferInfo.range = uniBlockSize;

	// Setup Write Descriptor Set
	VkWriteDescriptorSet writeDescSet = {};
	writeDescSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
	writeDescSet.descriptorCount = 1;
	writeDescSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
	writeDescSet.dstSet = descSet;
	writeDescSet.pBufferInfo = &bufferInfo;

	// Update Descriptor set/s
	vkUpdateDescriptorSets(_VkSystem.device, 1, &writeDescSet, 0, 0);

	*pDescLayout = descLayout;
	*pDescSet = descSet;
	*pDevMemory = devMemory2;
	*pUniBuffer = uniBuffer;
	*pDescPool = descPool;

	return res;
}