#include "vkutil.h"
#include "vkutil-pipeline.h"
-static VkuPipelineGenerator pipe_gen;
+static void set_resources_layouts(VkuPipelineGenerator *pipe_gen, std::vector<ResourceVK> *res);
RendererVK::RendererVK()
{
bool RendererVK::create_resources()
{
- /* default pipeline: create binding points */
+ /* default pipeline resources */
+
default_vs_ub = gfx_create_uniform_buffer();
if(!default_vs_ub->create(sizeof default_vs_uniforms)) {
fprintf(stderr, "Failed to create the default VS uniform buffer.\n");
return false;
}
default_resources.push_back(default_fs_res);
+ set_resources_layouts(&default_pipe_gen, &default_resources);
+
+ /* sky pipeline resources */
sky_vs_ub = gfx_create_uniform_buffer();
if(!sky_vs_ub->create(sizeof sky_vs_uniforms)) {
return false;
}
sky_resources.push_back(sky_vs_res);
+ set_resources_layouts(&sky_pipe_gen, &sky_resources);
return true;
}
bool RendererVK::create()
{
- if(!create_default_pipeline()) {
- fprintf(stderr, "Failed to create default pipeline.\n");
- return false;
- }
-
/* if(!create_sky_pipeline()) {
fprintf(stderr, "Failed to create sky pipeline.\n");
return false;
bool RendererVK::create_default_pipeline()
{
-
return true;
}
+
+static void set_resources_layouts(VkuPipelineGenerator *pipe_gen, std::vector<ResourceVK> *res)
+{
+ for(size_t i=0; i<res->size(); i++) {
+ if((*res)[i].type == RES_DESC_SET) {
+ pipe_gen->set_resources_layout((*res)[i].layout);
+ }
+ }
+}
#include "renderer.h"
#include "vulkan/resources.h"
+#include "vulkan/vkutil-pipeline.h"
class RendererVK : public Renderer {
private:
- VkDescriptorPool uniform_pool;
+ VkDescriptorPool res_pool;
- VkPipeline pipe_default;
+ VkuPipelineGenerator default_pipe_gen;
std::vector<ResourceVK> default_resources;
- VkPipeline pipe_morph;
- std::vector<ResourceVK> morph_resources;
-
- VkPipeline pipe_sky;
+ VkuPipelineGenerator sky_pipe_gen;
std::vector<ResourceVK> sky_resources;
bool create_default_pipeline();
RendererVK();
~RendererVK();
- bool create() override;
bool create_resources();
+ bool create() override;
+
};
#endif // RENDERER_VK_H_
bool ResourceVK::create_ds_layout(unsigned int num, VkDescriptorType type,
VkShaderStageFlags stage, VkSampler *sampler)
{
- res_type = RES_DESC_SET;
+ this->type = RES_DESC_SET;
/* layout binding */
VkDescriptorSetLayoutBinding bind;
};
class ResourceVK {
-private:
- ResourceType res_type;
-
+public:
+ ResourceType type;
VkDescriptorSetLayout layout;
VkPushConstantRange range;
-public:
ResourceVK();
~ResourceVK();
VkuPipelineGenerator::~VkuPipelineGenerator()
{
+ for(size_t i=0; i<res_layouts.size(); i++) {
+ vkDestroyDescriptorSetLayout(vk_device, res_layouts[i], 0);
+ }
+ vkDestroyPipelineLayout(vk_device, layout, 0);
}
-VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags) const
+VkPipeline VkuPipelineGenerator::generate(VkuDynState dyn_flags)
{
VkPipelineDynamicStateCreateInfo dyni;
memset(&dyni, 0, sizeof dyni);
//linf.pPushConstantRanges = push_const_ranges.data();
//maxPushConstantsSize from VkPhysicalDeviceLimits
- VkPipelineLayout layout;
if(vkCreatePipelineLayout(vk_device, &linf, 0, &layout) != VK_SUCCESS) {
fprintf(stderr, "Failed to create pipeline layout.\n");
return 0;
adsc.binding = binding;
adsc.format = format;
}
+
+void VkuPipelineGenerator::set_resources_layout(VkDescriptorSetLayout layout)
+{
+ res_layouts.push_back(layout);
+}
#define VKUTIL_PIPELINE_H_
#include <vulkan/vulkan.h>
+#include <vector>
enum VkuVertexBindings {
VKU_BIND_VERTEX,
std::vector<VkDescriptorSetLayout> res_layouts;
// std::vector<VkPushConstantRange> push_const_ranges;
+ VkPipelineLayout layout;
+
public:
VkuPipelineGenerator();
~VkuPipelineGenerator();
- VkPipeline generate(VkuDynState dyn_flags) const;
+ VkPipeline generate(VkuDynState dyn_flags);
void set_shader_modules(VkShaderModule vs, VkShaderModule fs);
void set_attribute(uint32_t binding, uint32_t stride, uint32_t location,
VkFormat format);
-
+ void set_resources_layout(VkDescriptorSetLayout layout);
};
#endif // VKUTIL_PIPELINE_H_