summaryrefslogtreecommitdiff
path: root/gfx/src/gfx.c
blob: 36020df5012f09fc4adbd08b145a1739dee9a00e (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
#include <gfx/gfx.h>

#include "asset/asset_cache.h"
#include "core/core_impl.h"
#include "renderer/imm_renderer_impl.h"
#include "renderer/renderer_impl.h"
#include "scene/scene_memory.h"

#include <log/log.h>

#include <assert.h>
#include <stdlib.h>

typedef struct Gfx {
  AssetCache  asset_cache;
  GfxCore     gfxcore;
  Renderer    renderer;
  ImmRenderer imm_renderer;
} Gfx;

Gfx* gfx_init(void) {
  if (!gladLoadGL()) {
    LOGE("Failed loading glad!");
    return 0;
  }

  Gfx* gfx = calloc(1, sizeof(Gfx));
  if (!gfx) {
    return 0;
  }
  gfx_init_gfxcore(&gfx->gfxcore);
  if (!renderer_make(&gfx->renderer, &gfx->gfxcore)) {
    gfx_destroy(&gfx);
    return 0;
  }
  if (!imm_renderer_make(&gfx->imm_renderer, &gfx->gfxcore)) {
    // TODO: Add error logs to the initialization failure cases here and inside
    // the renderers.
    gfx_destroy(&gfx);
    return 0;
  }
  gfx_init_asset_cache(&gfx->asset_cache);
  scene_mem_init();
  return gfx;
}

void gfx_destroy(Gfx** gfx) {
  if (!gfx) {
    return;
  }
  scene_mem_destroy();
  gfx_destroy_asset_cache(&(*gfx)->asset_cache);
  renderer_destroy(&(*gfx)->renderer);
  imm_renderer_destroy(&(*gfx)->imm_renderer);
  gfx_del_gfxcore(&(*gfx)->gfxcore);
  free(*gfx);
  *gfx = 0;
}

GfxCore* gfx_get_core(Gfx* gfx) {
  assert(gfx);
  return &gfx->gfxcore;
}

Renderer* gfx_get_renderer(Gfx* gfx) {
  assert(gfx);
  return &gfx->renderer;
}

ImmRenderer* gfx_get_imm_renderer(Gfx* gfx) {
  assert(gfx);
  return &gfx->imm_renderer;
}

AssetCache* gfx_get_asset_cache(Gfx* gfx) {
  assert(gfx);
  return &gfx->asset_cache;
}