summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gfx/CMakeLists.txt2
-rw-r--r--gfx/include/gfx/error.h22
-rw-r--r--gfx/src/error.c5
-rw-r--r--gfx/src/render/framebuffer.c67
-rw-r--r--gfx/src/render/renderbuffer.c14
-rw-r--r--gfx/src/render/texture.c5
-rw-r--r--gfx/src/scene/light.c10
-rw-r--r--gfx/src/util/scene.c4
-rw-r--r--gfx/src/util/texture.c20
-rw-r--r--gltfview/CMakeLists.txt1
-rw-r--r--gltfview/src/game.c4
11 files changed, 64 insertions, 90 deletions
diff --git a/gfx/CMakeLists.txt b/gfx/CMakeLists.txt
index f5c9b5a..f5ef44c 100644
--- a/gfx/CMakeLists.txt
+++ b/gfx/CMakeLists.txt
@@ -52,7 +52,6 @@ add_library(gfx SHARED
52 src/scene/object.c 52 src/scene/object.c
53 src/scene/scene.c 53 src/scene/scene.c
54 src/scene/scene_memory.c 54 src/scene/scene_memory.c
55 src/error.c
56 src/gfx.c 55 src/gfx.c
57 src/util/geometry.c 56 src/util/geometry.c
58 src/util/ibl.c 57 src/util/ibl.c
@@ -75,6 +74,7 @@ target_link_libraries(gfx PUBLIC
75target_link_libraries(gfx PRIVATE 74target_link_libraries(gfx PRIVATE
76 cgltf 75 cgltf
77 cgltf-tangents 76 cgltf-tangents
77 error
78 glad 78 glad
79 listpool 79 listpool
80 log 80 log
diff --git a/gfx/include/gfx/error.h b/gfx/include/gfx/error.h
deleted file mode 100644
index 062dba1..0000000
--- a/gfx/include/gfx/error.h
+++ /dev/null
@@ -1,22 +0,0 @@
1#pragma once
2
3#include <cstring.h>
4#include <stdio.h>
5
6/// Get the last error.
7const char* gfx_get_error(void);
8
9extern xlstring gfx_error;
10
11/// Set the last error.
12#define gfx_set_error(...) \
13 gfx_error.length = snprintf(gfx_error.str, xlstring_size, __VA_ARGS__)
14
15/// Prepend an error to the last error.
16#define gfx_prepend_error(...) \
17 { \
18 xlstring head; \
19 head.length = snprintf(head.str, xlstring_size, __VA_ARGS__); \
20 xlstring_append(&head, xlstring_make(": ")); \
21 gfx_error = xlstring_concat(head, gfx_error); \
22 }
diff --git a/gfx/src/error.c b/gfx/src/error.c
deleted file mode 100644
index 4370097..0000000
--- a/gfx/src/error.c
+++ /dev/null
@@ -1,5 +0,0 @@
1#include <gfx/error.h>
2
3xlstring gfx_error;
4
5const char* gfx_get_error(void) { return xlstring_cstr(&gfx_error); }
diff --git a/gfx/src/render/framebuffer.c b/gfx/src/render/framebuffer.c
index 323ef56..84ade4a 100644
--- a/gfx/src/render/framebuffer.c
+++ b/gfx/src/render/framebuffer.c
@@ -3,12 +3,12 @@
3#include "renderbuffer.h" 3#include "renderbuffer.h"
4#include "texture.h" 4#include "texture.h"
5 5
6#include <gfx/error.h> 6#include <error.h>
7 7
8#include <assert.h> 8#include <assert.h>
9 9
10static void framebuffer_attach_colour(FrameBuffer* framebuffer, 10static void framebuffer_attach_colour(
11 const FrameBufferAttachment* attachment) { 11 FrameBuffer* framebuffer, const FrameBufferAttachment* attachment) {
12 assert(framebuffer); 12 assert(framebuffer);
13 assert(attachment); 13 assert(attachment);
14 14
@@ -16,27 +16,28 @@ static void framebuffer_attach_colour(FrameBuffer* framebuffer,
16 case FrameBufferNoAttachment: 16 case FrameBufferNoAttachment:
17 break; 17 break;
18 case FrameBufferTexture: 18 case FrameBufferTexture:
19 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 19 glFramebufferTexture2D(
20 attachment->texture.texture->id, 20 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
21 attachment->texture.mip_level); 21 attachment->texture.texture->id, attachment->texture.mip_level);
22 break; 22 break;
23 case FrameBufferCubemapTexture: 23 case FrameBufferCubemapTexture:
24 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 24 glFramebufferTexture2D(
25 to_GL_cubemap_face(attachment->cubemap.face), 25 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
26 attachment->cubemap.texture->id, 26 to_GL_cubemap_face(attachment->cubemap.face),
27 attachment->cubemap.mip_level); 27 attachment->cubemap.texture->id, attachment->cubemap.mip_level);
28 break; 28 break;
29 case FrameBufferRenderBuffer: 29 case FrameBufferRenderBuffer:
30 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 30 glFramebufferRenderbuffer(
31 GL_RENDERBUFFER, attachment->renderbuffer->id); 31 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
32 attachment->renderbuffer->id);
32 break; 33 break;
33 } 34 }
34 35
35 ASSERT_GL; 36 ASSERT_GL;
36} 37}
37 38
38static void framebuffer_attach_depth(FrameBuffer* framebuffer, 39static void framebuffer_attach_depth(
39 const FrameBufferAttachment* attachment) { 40 FrameBuffer* framebuffer, const FrameBufferAttachment* attachment) {
40 assert(framebuffer); 41 assert(framebuffer);
41 assert(attachment); 42 assert(attachment);
42 43
@@ -44,33 +45,33 @@ static void framebuffer_attach_depth(FrameBuffer* framebuffer,
44 case FrameBufferNoAttachment: 45 case FrameBufferNoAttachment:
45 break; 46 break;
46 case FrameBufferTexture: 47 case FrameBufferTexture:
47 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 48 glFramebufferTexture2D(
48 GL_DEPTH_COMPONENT, attachment->texture.texture->id, 49 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_DEPTH_COMPONENT,
49 attachment->texture.mip_level); 50 attachment->texture.texture->id, attachment->texture.mip_level);
50 break; 51 break;
51 // TODO: Could distinguish between colour and depth attachment types to make 52 // TODO: Could distinguish between colour and depth attachment types to make
52 // this a compile-time error. 53 // this a compile-time error.
53 case FrameBufferCubemapTexture: 54 case FrameBufferCubemapTexture:
54 gfx_set_error( 55 set_error("Cannot use a cubemap texture as a depth framebuffer attachment");
55 "Cannot use a cubemap texture as a depth framebuffer attachment");
56 break; 56 break;
57 case FrameBufferRenderBuffer: 57 case FrameBufferRenderBuffer:
58 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, 58 glFramebufferRenderbuffer(
59 GL_RENDERBUFFER, attachment->renderbuffer->id); 59 GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
60 attachment->renderbuffer->id);
60 break; 61 break;
61 } 62 }
62 63
63 ASSERT_GL; 64 ASSERT_GL;
64} 65}
65 66
66bool gfx_init_framebuffer(FrameBuffer* framebuffer, 67bool gfx_init_framebuffer(
67 const FrameBufferDesc* desc) { 68 FrameBuffer* framebuffer, const FrameBufferDesc* desc) {
68 assert(framebuffer); 69 assert(framebuffer);
69 assert(desc); 70 assert(desc);
70 71
71 glGenFramebuffers(1, &framebuffer->id); 72 glGenFramebuffers(1, &framebuffer->id);
72 if (!framebuffer->id) { 73 if (!framebuffer->id) {
73 gfx_set_error("glGenFramebuffers() failed"); 74 set_error("glGenFramebuffers() failed");
74 return false; 75 return false;
75 } 76 }
76 77
@@ -84,7 +85,7 @@ bool gfx_init_framebuffer(FrameBuffer* framebuffer,
84 framebuffer_attach_colour(framebuffer, &desc->colour); 85 framebuffer_attach_colour(framebuffer, &desc->colour);
85 framebuffer_attach_depth(framebuffer, &desc->depth); 86 framebuffer_attach_depth(framebuffer, &desc->depth);
86 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 87 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
87 gfx_set_error("glCheckFramebufferStatus() failed"); 88 set_error("glCheckFramebufferStatus() failed");
88 gfx_del_framebuffer(framebuffer); 89 gfx_del_framebuffer(framebuffer);
89 return false; 90 return false;
90 } 91 }
@@ -95,8 +96,8 @@ bool gfx_init_framebuffer(FrameBuffer* framebuffer,
95 return true; 96 return true;
96} 97}
97 98
98bool gfx_framebuffer_attach_colour(FrameBuffer* framebuffer, 99bool gfx_framebuffer_attach_colour(
99 const FrameBufferAttachment* attachment) { 100 FrameBuffer* framebuffer, const FrameBufferAttachment* attachment) {
100 assert(framebuffer); 101 assert(framebuffer);
101 assert(attachment); 102 assert(attachment);
102 103
@@ -104,14 +105,14 @@ bool gfx_framebuffer_attach_colour(FrameBuffer* framebuffer,
104 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id); 105 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id);
105 framebuffer_attach_colour(framebuffer, attachment); 106 framebuffer_attach_colour(framebuffer, attachment);
106 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 107 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
107 gfx_set_error("glCheckFramebufferStatus() failed"); 108 set_error("glCheckFramebufferStatus() failed");
108 return false; 109 return false;
109 } 110 }
110 return true; 111 return true;
111} 112}
112 113
113bool gfx_framebuffer_attach_depth(FrameBuffer* framebuffer, 114bool gfx_framebuffer_attach_depth(
114 const FrameBufferAttachment* attachment) { 115 FrameBuffer* framebuffer, const FrameBufferAttachment* attachment) {
115 assert(framebuffer); 116 assert(framebuffer);
116 assert(attachment); 117 assert(attachment);
117 118
@@ -119,7 +120,7 @@ bool gfx_framebuffer_attach_depth(FrameBuffer* framebuffer,
119 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id); 120 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer->id);
120 framebuffer_attach_depth(framebuffer, attachment); 121 framebuffer_attach_depth(framebuffer, attachment);
121 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 122 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
122 gfx_set_error("glCheckFramebufferStatus() failed"); 123 set_error("glCheckFramebufferStatus() failed");
123 return false; 124 return false;
124 } 125 }
125 return true; 126 return true;
@@ -143,8 +144,8 @@ void gfx_deactivate_framebuffer(const FrameBuffer* framebuffer) {
143 glBindFramebuffer(GL_FRAMEBUFFER, 0); 144 glBindFramebuffer(GL_FRAMEBUFFER, 0);
144} 145}
145 146
146void gfx_framebuffer_set_viewport(FrameBuffer* framebuffer, int x, int y, 147void gfx_framebuffer_set_viewport(
147 int width, int height) { 148 FrameBuffer* framebuffer, int x, int y, int width, int height) {
148 assert(framebuffer); 149 assert(framebuffer);
149 glViewport(x, y, width, height); 150 glViewport(x, y, width, height);
150} 151}
diff --git a/gfx/src/render/renderbuffer.c b/gfx/src/render/renderbuffer.c
index 3b19483..a2eae52 100644
--- a/gfx/src/render/renderbuffer.c
+++ b/gfx/src/render/renderbuffer.c
@@ -2,23 +2,23 @@
2 2
3#include "texture.h" 3#include "texture.h"
4 4
5#include <gfx/error.h> 5#include <error.h>
6 6
7bool gfx_init_renderbuffer(RenderBuffer* renderbuffer, 7bool gfx_init_renderbuffer(
8 const RenderBufferDesc* desc) { 8 RenderBuffer* renderbuffer, const RenderBufferDesc* desc) {
9 assert(renderbuffer); 9 assert(renderbuffer);
10 assert(desc); 10 assert(desc);
11 11
12 glGenRenderbuffers(1, &renderbuffer->id); 12 glGenRenderbuffers(1, &renderbuffer->id);
13 if (!renderbuffer->id) { 13 if (!renderbuffer->id) {
14 gfx_set_error("glGenRenderbuffers failed"); 14 set_error("glGenRenderbuffers failed");
15 return false; 15 return false;
16 } 16 }
17 17
18 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer->id); 18 glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer->id);
19 glRenderbufferStorage(GL_RENDERBUFFER, 19 glRenderbufferStorage(
20 to_GL_internal_format(desc->texture_format), 20 GL_RENDERBUFFER, to_GL_internal_format(desc->texture_format), desc->width,
21 desc->width, desc->height); 21 desc->height);
22 glBindRenderbuffer(GL_RENDERBUFFER, 0); 22 glBindRenderbuffer(GL_RENDERBUFFER, 0);
23 23
24 ASSERT_GL; 24 ASSERT_GL;
diff --git a/gfx/src/render/texture.c b/gfx/src/render/texture.c
index 31bf636..312aecc 100644
--- a/gfx/src/render/texture.c
+++ b/gfx/src/render/texture.c
@@ -1,7 +1,6 @@
1#include "texture.h" 1#include "texture.h"
2 2
3#include <gfx/error.h> 3#include <error.h>
4
5#include <math/defs.h> 4#include <math/defs.h>
6 5
7#include <assert.h> 6#include <assert.h>
@@ -13,7 +12,7 @@ bool gfx_init_texture(Texture* texture, const TextureDesc* desc) {
13 12
14 glGenTextures(1, &texture->id); 13 glGenTextures(1, &texture->id);
15 if (!texture->id) { 14 if (!texture->id) {
16 gfx_set_error("glGenTextures() failed"); 15 set_error("glGenTextures() failed");
17 return false; 16 return false;
18 } 17 }
19 texture->target = to_GL_dimension(desc->dimension); 18 texture->target = to_GL_dimension(desc->dimension);
diff --git a/gfx/src/scene/light.c b/gfx/src/scene/light.c
index 2ca1a01..31dca77 100644
--- a/gfx/src/scene/light.c
+++ b/gfx/src/scene/light.c
@@ -3,14 +3,14 @@
3#include "node_impl.h" 3#include "node_impl.h"
4#include "scene_memory.h" 4#include "scene_memory.h"
5 5
6#include <gfx/error.h> 6#include <error.h>
7 7
8static void make_environment_light(Light* light, 8static void make_environment_light(
9 const EnvironmentLightDesc* desc) { 9 Light* light, const EnvironmentLightDesc* desc) {
10 assert(light); 10 assert(light);
11 assert(desc); 11 assert(desc);
12 12
13 light->type = EnvironmentLightType; 13 light->type = EnvironmentLightType;
14 light->environment.environment_map = desc->environment_map; 14 light->environment.environment_map = desc->environment_map;
15} 15}
16 16
@@ -27,7 +27,7 @@ Light* gfx_make_light(const LightDesc* desc) {
27 make_environment_light(light, &desc->light.environment); 27 make_environment_light(light, &desc->light.environment);
28 break; 28 break;
29 default: 29 default:
30 gfx_set_error("Unhandled light type"); 30 set_error("Unhandled light type");
31 gfx_destroy_light(&light); 31 gfx_destroy_light(&light);
32 return 0; 32 return 0;
33 } 33 }
diff --git a/gfx/src/util/scene.c b/gfx/src/util/scene.c
index a638fa5..5d79cf2 100644
--- a/gfx/src/util/scene.c
+++ b/gfx/src/util/scene.c
@@ -81,7 +81,6 @@
81 81
82#include <gfx/util/scene.h> 82#include <gfx/util/scene.h>
83 83
84#include <gfx/error.h>
85#include <gfx/gfx.h> 84#include <gfx/gfx.h>
86#include <gfx/render_backend.h> 85#include <gfx/render_backend.h>
87#include <gfx/scene/animation.h> 86#include <gfx/scene/animation.h>
@@ -96,6 +95,7 @@
96#include <gfx/util/texture.h> 95#include <gfx/util/texture.h>
97 96
98#include <cstring.h> 97#include <cstring.h>
98#include <error.h>
99#include <log/log.h> 99#include <log/log.h>
100#include <math/camera.h> 100#include <math/camera.h>
101#include <math/defs.h> 101#include <math/defs.h>
@@ -702,7 +702,7 @@ static bool load_texture_and_uniform(
702 702
703 textures[texture_index] = gfx_load_texture(render_backend, cmd); 703 textures[texture_index] = gfx_load_texture(render_backend, cmd);
704 if (!textures[texture_index]) { 704 if (!textures[texture_index]) {
705 gfx_prepend_error( 705 prepend_error(
706 "Failed to load texture: %s", 706 "Failed to load texture: %s",
707 mstring_cstr(&cmd->data.texture.filepath)); 707 mstring_cstr(&cmd->data.texture.filepath));
708 return false; 708 return false;
diff --git a/gfx/src/util/texture.c b/gfx/src/util/texture.c
index 0727dae..7ec0e40 100644
--- a/gfx/src/util/texture.c
+++ b/gfx/src/util/texture.c
@@ -1,8 +1,9 @@
1#include <gfx/util/texture.h> 1#include <gfx/util/texture.h>
2 2
3#include <gfx/error.h>
4#include <gfx/render_backend.h> 3#include <gfx/render_backend.h>
5 4
5#include <error.h>
6
6#define STB_IMAGE_IMPLEMENTATION 7#define STB_IMAGE_IMPLEMENTATION
7#include <stb_image.h> 8#include <stb_image.h>
8 9
@@ -60,7 +61,7 @@ Texture* gfx_load_texture(
60 stbi_set_flip_vertically_on_load(0); 61 stbi_set_flip_vertically_on_load(0);
61 pixels[0] = stbi_load(filepath, &width, &height, &components, 0); 62 pixels[0] = stbi_load(filepath, &width, &height, &components, 0);
62 if (!pixels[0]) { 63 if (!pixels[0]) {
63 gfx_set_error("Failed to load texture file: %s", filepath); 64 set_error("Failed to load texture file: %s", filepath);
64 } 65 }
65 break; 66 break;
66 } 67 }
@@ -73,13 +74,12 @@ Texture* gfx_load_texture(
73 stbi_uc* image_pixels = 74 stbi_uc* image_pixels =
74 stbi_load(filepath, &width, &height, &components, 0); 75 stbi_load(filepath, &width, &height, &components, 0);
75 if (!image_pixels) { 76 if (!image_pixels) {
76 gfx_set_error("Failed to load texture file: %s", filepath); 77 set_error("Failed to load texture file: %s", filepath);
77 break; 78 break;
78 } 79 }
79 if (i > 0 && components != old_components) { 80 if (i > 0 && components != old_components) {
80 gfx_set_error( 81 set_error("All textures in a cubemap must have the same number of "
81 "All textures in a cubemap must have the same number of " 82 "components");
82 "components");
83 break; 83 break;
84 } 84 }
85 if ((i != 2) && (i != 3)) { 85 if ((i != 2) && (i != 3)) {
@@ -93,7 +93,7 @@ Texture* gfx_load_texture(
93 break; 93 break;
94 case TextureFromMemory: 94 case TextureFromMemory:
95 // TODO: Load textures from memory. 95 // TODO: Load textures from memory.
96 gfx_set_error("Loading textures from memory is not yet implemented"); 96 set_error("Loading textures from memory is not yet implemented");
97 return 0; 97 return 0;
98 } 98 }
99 99
@@ -132,7 +132,7 @@ Texture* gfx_load_texture(
132 desc.format = TextureSRGB8; 132 desc.format = TextureSRGB8;
133 break; 133 break;
134 default: 134 default:
135 gfx_set_error("Unsupported texture colour space: %d", cmd->colour_space); 135 set_error("Unsupported texture colour space: %d", cmd->colour_space);
136 return 0; 136 return 0;
137 } 137 }
138 break; 138 break;
@@ -145,12 +145,12 @@ Texture* gfx_load_texture(
145 desc.format = TextureSRGBA8; 145 desc.format = TextureSRGBA8;
146 break; 146 break;
147 default: 147 default:
148 gfx_set_error("Unsupported texture colour space: %d", cmd->colour_space); 148 set_error("Unsupported texture colour space: %d", cmd->colour_space);
149 return 0; 149 return 0;
150 } 150 }
151 break; 151 break;
152 default: 152 default:
153 gfx_set_error("Unsupported number of texture components: %d", components); 153 set_error("Unsupported number of texture components: %d", components);
154 return 0; 154 return 0;
155 } 155 }
156 156
diff --git a/gltfview/CMakeLists.txt b/gltfview/CMakeLists.txt
index 0b0c3cc..de745ce 100644
--- a/gltfview/CMakeLists.txt
+++ b/gltfview/CMakeLists.txt
@@ -13,6 +13,7 @@ target_include_directories(gltfview PRIVATE
13 13
14target_link_libraries(gltfview PRIVATE 14target_link_libraries(gltfview PRIVATE
15 cstring 15 cstring
16 error
16 gfx 17 gfx
17 gfx-app 18 gfx-app
18 list 19 list
diff --git a/gltfview/src/game.c b/gltfview/src/game.c
index 6d8430b..7470f75 100644
--- a/gltfview/src/game.c
+++ b/gltfview/src/game.c
@@ -9,11 +9,11 @@
9#include "game.h" 9#include "game.h"
10#include "plugins/plugin.h" 10#include "plugins/plugin.h"
11 11
12#include <gfx/error.h>
13#include <gfx/render_backend.h> 12#include <gfx/render_backend.h>
14#include <gfx/scene/camera.h> 13#include <gfx/scene/camera.h>
15#include <gfx/scene/object.h> 14#include <gfx/scene/object.h>
16 15
16#include <error.h>
17#include <log/log.h> 17#include <log/log.h>
18#include <math/camera.h> 18#include <math/camera.h>
19#include <plugin.h> 19#include <plugin.h>
@@ -105,7 +105,7 @@ bool game_new(Game* game, int argc, const char** argv) {
105 return true; 105 return true;
106 106
107cleanup: 107cleanup:
108 LOGE("Gfx error: %s", gfx_get_error()); 108 LOGE("Gfx error: %s", get_error());
109 game_end(game); 109 game_end(game);
110 return false; 110 return false;
111} 111}