65 lines
1.8 KiB
C++

#pragma once
#include "vulkan_state.h"
#include "font/instance_data.h"
namespace font::bitmap {
struct LoadedFont {
VkImage image;
VkDeviceMemory memory;
VkImageView imageView;
};
struct vulkan {
static constexpr int maximumGlyphCount = 1024;
static constexpr VkDeviceSize instanceBufferSize{ maximumGlyphCount * (sizeof (BitmapInstance)) };
VulkanState const * const vk;
VkPipelineLayout pipelineLayout;
VkPipeline pipeline;
::InstanceBuffer instanceBuffer;
BitmapInstance * bitmapInstance[2];
VkDescriptorPool descriptorPool;
static constexpr uint32_t descriptorSetLayoutCount = 1;
VkDescriptorSetLayout descriptorSetLayouts[descriptorSetLayoutCount];
VkDescriptorSet descriptorSet0;
LoadedFont loadedFont;
vulkan(VulkanState const * vk)
: vk(vk)
{
createDescriptorSets();
createPipeline();
loadedFont = loadFont();
writeDescriptorSets(loadedFont.imageView);
createInstanceBuffer(vk->device,
vk->physicalDeviceProperties,
vk->physicalDeviceMemoryProperties,
instanceBufferSize,
&instanceBuffer);
bitmapInstance[0] = (BitmapInstance *)(((ptrdiff_t)instanceBuffer.mappedData) + instanceBuffer.offset[0]);
bitmapInstance[1] = (BitmapInstance *)(((ptrdiff_t)instanceBuffer.mappedData) + instanceBuffer.offset[1]);
}
LoadedFont loadFont();
void createDescriptorSets();
void writeDescriptorSets(VkImageView imageView);
void update(uint32_t frameIndex,
uint32_t glyphCount) const;
void draw(VkCommandBuffer commandBuffer,
uint32_t frameIndex,
uint32_t glyphCount) const;
private:
void createPipeline();
};
}