summaryrefslogtreecommitdiff
path: root/prge_shader.c
blob: 21a91f326a90720555a34116010d368282922a24 (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
U32 compile_shader(GLenum type, Str8 filename)
{
	Arena *tmp = arena_alloc(0);

	Str8 src = str8_read_entire_file(tmp, filename);
	if (!src.ptr || !src.length) {
		str8print(str8_pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename)));
		arena_release(tmp);
		return 0;
	}

	const char *csrc = str8_to_cstr(tmp, src);

	U32 id = glCreateShader(type);
	glShaderSource(id, 1, &csrc, 0);
	glCompileShader(id);

	S32 status;
	glGetShaderiv(id, GL_COMPILE_STATUS, &status);
	if (status == GL_FALSE) {
		char log[512];
		glGetShaderInfoLog(id, 512, 0, log);
		str8print(str8_pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log));
	} else {
		str8print(str8_pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename)));
	}

	arena_release(tmp);

	return id;
}

U32 create_shader_program(Str8 vert_filename, Str8 frag_filename)
{
	U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename);
	U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename);

	Arena *tmp = arena_alloc(0);

	U32 id = glCreateProgram();
	glAttachShader(id, vert);
	glAttachShader(id, frag);
	glLinkProgram(id);
	S32 success;
	glGetProgramiv(id, GL_LINK_STATUS, &success);
	if (success == GL_FALSE) {
		char log[512];
		glGetProgramInfoLog(id, 512, 0, log);
		str8print(str8_pushf(tmp, "[ERROR]: Failed to link shader program:\n%s", log));
	} else {
		str8print(str8_pushf(tmp, "[INFO]: Shader program linked successfuly.\n\n"));
	}
	glDeleteShader(vert);
	glDeleteShader(frag);

	arena_release(tmp);

	return id;
}

void shader_set_mat4fv(U32 id, char *name, Mat4 m)
{
	S32 loc = glGetUniformLocation(id, name);
	glUniformMatrix4fv(loc, 1, 0, (F32 *)&m);
}