#include <vulkan/vulkan.h>
+#include <stdio.h>
+#include "gfxapi.h"
#include "renderer-vk.h"
#include "uniforms.h"
+#include "vkutil.h"
+#include "vkutil-pipeline.h"
+
+static void set_resources_layouts(VkuPipelineGenerator *pipe_gen, std::vector<ResourceVK> *res);
RendererVK::RendererVK()
{
dskytex = 0;
fog_density = 0;
- vbuf = fbuf = svbuf = 0;
+
+ default_vs_ub = 0;
+ default_fs_ub = 0;
+ sky_vs_ub = 0;
}
RendererVK::~RendererVK()
{
- delete vbuf;
- delete fbuf;
- delete svbuf;
+ delete default_vs_ub;
+ delete default_fs_ub;
+ delete sky_vs_ub;
}
-bool RendererVK::create()
+bool RendererVK::create_resources()
{
- if(!create_default_pipeline()) {
- fprintf(stderr, "Failed to create default pipeline.\n");
+ /* default pipeline resources */
+
+ default_vs_ub = gfx_create_uniform_buffer();
+ int data_size = sizeof default_vs_uniforms;
+ if(!default_vs_ub->create(data_size)) {
+ fprintf(stderr, "Failed to create the default VS uniform buffer.\n");
+ return false;
+ }
+ ResourceVK default_vs_res;
+ if(!default_vs_res.create_ds_layout(MATRIX_UNIFORMS,
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ VK_SHADER_STAGE_VERTEX_BIT, 0)) {
+ fprintf(stderr, "Failed to create the ds layout for the default vs uniform buffer.\n");
+ return false;
+ }
+ default_vs_res.size = data_size;
+ default_resources.push_back(default_vs_res);
+
+ default_fs_ub = gfx_create_uniform_buffer();
+ if(!default_fs_ub->create(sizeof default_fs_uniforms)) {
+ fprintf(stderr, "Failed to create the default FS uniform buffer.\n");
+ return false;
+ }
+ ResourceVK default_fs_res;
+ if(!default_fs_res.create_ds_layout(SHADING_UNIFORMS,
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ VK_SHADER_STAGE_FRAGMENT_BIT, 0)) {
+ fprintf(stderr, "Failed to create the ds layout for 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 */
-/* if(!create_sky_pipeline()) {
- fprintf(stderr, "Failed to create sky pipeline.\n");
+ sky_vs_ub = gfx_create_uniform_buffer();
+ if(!sky_vs_ub->create(sizeof sky_vs_uniforms)) {
+ fprintf(stderr, "Failed to create the VS uniform buffer for the sky.\n");
return false;
- }*/
+ }
+ ResourceVK sky_vs_res;
+ if(!sky_vs_res.create_ds_layout(SKY_MATRIX_UNIFORMS,
+ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ VK_SHADER_STAGE_FRAGMENT_BIT, 0)) {
+ fprintf(stderr, "Failed to create the ds layout for the sky VS uniform buffer.\n");
+ return false;
+ }
+ sky_resources.push_back(sky_vs_res);
+ set_resources_layouts(&sky_pipe_gen, &sky_resources);
+
+ return true;
+}
+
+bool RendererVK::create()
+{
+ /* if(!create_sky_pipeline()) {
+ fprintf(stderr, "Failed to create sky pipeline.\n");
+ return false;
+ }*/
return true;
}
bool RendererVK::create_default_pipeline()
{
- /* vertex */
return true;
}
+
+bool RendererVK::create_desc_pool()
+{
+ int num_desc = default_resources.size() + sky_resources.size();
+ VkDescriptorPoolCreateInfo dpinf;
+ memset(&dpinf, 0, sizeof dpinf);
+
+ dpinf.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ dpinf.maxSets = num_desc + 1;
+ dpinf.poolSizeCount = num_desc;
+
+ for(size_t i=0; i<default_resources.size(); i++) {
+ }
+ 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);
+ }
+ }
+}