This commit is contained in:
Abdelrahman Said 2024-09-14 00:04:31 +01:00
parent fb1b8457d6
commit 09e9f611f8
2 changed files with 15 additions and 22 deletions

View File

@ -5,16 +5,15 @@
typedef struct shader_repo ShaderRepo; typedef struct shader_repo ShaderRepo;
struct shader_repo { struct shader_repo {
void *shaders[MAX_SHADER_COUNT]; void *shaders[MAX_SHADER_COUNT];
VertexShader *vertex_funcs[MAX_SHADER_COUNT]; VertexShader *vertex_funcs[MAX_SHADER_COUNT];
FragmentShader *fragment_funcs[MAX_SHADER_COUNT]; FragmentShader *fragment_funcs[MAX_SHADER_COUNT];
u64 count; u64 count;
}; };
internal ShaderRepo g_repository = {0}; internal ShaderRepo g_repository = {0};
ShaderID register_shader(void *shader, VertexShader *vertex, ShaderID register_shader(void *shader, VertexShader *vertex, FragmentShader *fragment) {
FragmentShader *fragment) {
if (g_repository.count + 1 >= MAX_SHADER_COUNT) { if (g_repository.count + 1 >= MAX_SHADER_COUNT) {
return INVALID_SHADER; return INVALID_SHADER;
} }
@ -27,8 +26,7 @@ ShaderID register_shader(void *shader, VertexShader *vertex,
return (ShaderID){g_repository.count}; return (ShaderID){g_repository.count};
} }
VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, const Model *model) {
const Model *model) {
if (IS_INVALID_SHADER(shader) || shader.id > g_repository.count || !vert || !model) { if (IS_INVALID_SHADER(shader) || shader.id > g_repository.count || !vert || !model) {
return (VertexData){0}; return (VertexData){0};
} }
@ -43,8 +41,8 @@ VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index,
return vertex_func(shader_obj, vert, index, model); return vertex_func(shader_obj, vert, index, model);
} }
FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const Colour *colour,
const Colour *colour, const Model *model) { const Model *model) {
if (IS_INVALID_SHADER(shader) || shader.id > g_repository.count || !colour) { if (IS_INVALID_SHADER(shader) || shader.id > g_repository.count || !colour) {
return DISCARDED_FRAGMENT; return DISCARDED_FRAGMENT;
} }

View File

@ -24,22 +24,17 @@ struct fragment_result {
bool discard; bool discard;
}; };
#define INVALID_SHADER ((ShaderID){0}) #define INVALID_SHADER ((ShaderID){0})
#define IS_INVALID_SHADER(ID) (ID.id == 0) #define IS_INVALID_SHADER(ID) (ID.id == 0)
#define DISCARDED_FRAGMENT ((FragmentResult){.discard = true}) #define DISCARDED_FRAGMENT ((FragmentResult){.discard = true})
#define DISCARD_FRAGMENT(RESULT) (RESULT.discard) #define DISCARD_FRAGMENT(RESULT) (RESULT.discard)
typedef VertexData(VertexShader)(void *shader, const VertexData *vert, u8 index, typedef VertexData(VertexShader)(void *shader, const VertexData *vert, u8 index, const Model *model);
const Model *model); typedef FragmentResult(FragmentShader)(void *shader, const V3f *barycentric, const Colour *colour,
typedef FragmentResult(FragmentShader)(void *shader, const V3f *barycentric,
const Colour *colour,
const Model *model); const Model *model);
ShaderID register_shader(void *shader, VertexShader *vertex, ShaderID register_shader(void *shader, VertexShader *vertex, FragmentShader *fragment);
FragmentShader *fragment); VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, const Model *model);
VertexData run_vertex_shader(ShaderID shader, const VertexData *vert, u8 index, FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric, const Colour *colour, const Model *model);
const Model *model);
FragmentResult run_fragment_shader(ShaderID shader, const V3f *barycentric,
const Colour *colour, const Model *model);
#endif // SHADER_H #endif // SHADER_H