summaryrefslogtreecommitdiff
path: root/src/renderer/ral.c
blob: 9ca99ce3ae9b0590ae1a08fe2764f1e11aedb21a (plain)
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
95
96
97
#include "ral.h"
#include "file.h"
#include "log.h"
#include "mem.h"
#include "str.h"

#if defined(CEL_REND_BACKEND_VULKAN)
#include "backend_vulkan.h"
#elif defined(CEL_REND_BACKEND_METAL)
#include "backend_metal.h"
#elif defined(CEL_REND_BACKEND_OPENGL)
#include "backend_opengl.h"
#endif

size_t vertex_attrib_size(vertex_attrib_type attr) {
  switch (attr) {
    case ATTR_F32:
    case ATTR_U32:
    case ATTR_I32:
      return 4;
    case ATTR_F32x2:
    case ATTR_U32x2:
    case ATTR_I32x2:
      return 8;
    case ATTR_F32x3:
    case ATTR_U32x3:
    case ATTR_I32x3:
      return 12;
    case ATTR_F32x4:
    case ATTR_U32x4:
    case ATTR_I32x4:
      return 16;
      break;
  }
}

void vertex_desc_add(vertex_description* builder, const char* name, vertex_attrib_type type) {
  u32 i = builder->attributes_count;

  size_t size = vertex_attrib_size(type);
  builder->attributes[i] = type;
  builder->stride += size;
  builder->attr_names[i] = name;

  builder->attributes_count++;
}

vertex_description static_3d_vertex_description() {
  vertex_description builder = { .debug_label = "Standard static 3d vertex format" };
  vertex_desc_add(&builder, "inPosition", ATTR_F32x3);
  vertex_desc_add(&builder, "inNormal", ATTR_F32x3);
  vertex_desc_add(&builder, "inTexCoords", ATTR_F32x2);
  builder.use_full_vertex_size = true;
  return builder;
}

void backend_pools_init(arena* a, gpu_backend_pools* backend_pools) {
  pipeline_layout_pool pipeline_layout_pool =
      pipeline_layout_pool_create(a, MAX_PIPELINES, sizeof(gpu_pipeline_layout));
  backend_pools->pipeline_layouts = pipeline_layout_pool;
  pipeline_pool pipeline_pool = pipeline_pool_create(a, MAX_PIPELINES, sizeof(gpu_pipeline));
  backend_pools->pipelines = pipeline_pool;
  renderpass_pool rpass_pool = renderpass_pool_create(a, MAX_RENDERPASSES, sizeof(gpu_renderpass));
  backend_pools->renderpasses = rpass_pool;

  // context.gpu_pools;
}

void resource_pools_init(arena* a, struct resource_pools* res_pools) {
  buffer_pool buf_pool = buffer_pool_create(a, MAX_BUFFERS, sizeof(gpu_buffer));
  res_pools->buffers = buf_pool;
  texture_pool tex_pool = texture_pool_create(a, MAX_TEXTURES, sizeof(gpu_texture));
  res_pools->textures = tex_pool;

  // context.resource_pools = res_pools;
}

void print_shader_binding(shader_binding b) {
  printf("Binding name: %s type %s vis %d stores data %d\n", b.label,
         shader_binding_type_name[b.type], b.vis, b.stores_data);
}

shader_desc shader_quick_load(const char* filepath) {
  arena a = arena_create(malloc(1024 * 1024), 1024 * 1024);
  str8 path = str8_cstr_view(filepath);
  str8_opt shader = str8_from_file(&a, path);
  if (!shader.has_value) {
    ERROR_EXIT("Failed to load shaders from disk");
  }

  return (shader_desc){
    .debug_name = filepath,
    .code = shader.contents,
    .filepath = path,
    .is_spirv = true,
  };
}