Cleaned up some of the bugs in the shader loading.

This commit is contained in:
siriusfox 2022-07-02 18:27:19 -07:00
parent 08b4825cd2
commit 1a96538a0e
3 changed files with 28 additions and 16 deletions

View file

@ -44,12 +44,14 @@ int main(void) {
char infoLog[512]; char infoLog[512];
// Create the vertex shader // Create the vertex shader
char *shdr_src_vertex = readshader("vertex.glsl"); GLchar *shdr_src_vertex;
readshader("vertex.glsl", &shdr_src_vertex);
u32 vertexShader = glCreateShader(GL_VERTEX_SHADER); u32 vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &shdr_src_vertex, NULL); glShaderSource(vertexShader, 1, &shdr_src_vertex, NULL);
glCompileShader(vertexShader); glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
freeshader(shdr_src_vertex); freeshader(shdr_src_vertex);
if (!success) { if (!success) {
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR SHADER::VERTEX::Compilation Failed\n" << std::cout << "ERROR SHADER::VERTEX::Compilation Failed\n" <<
@ -58,7 +60,8 @@ int main(void) {
} }
// Create the fragment shader // Create the fragment shader
char *shdr_src_fragment = readshader("fragment.glsl"); GLchar *shdr_src_fragment;
readshader("fragment.glsl", &shdr_src_fragment);
u32 fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); u32 fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &shdr_src_fragment, NULL); glShaderSource(fragmentShader, 1, &shdr_src_fragment, NULL);
glCompileShader(fragmentShader); glCompileShader(fragmentShader);

View file

@ -5,43 +5,51 @@
#include <cassert> #include <cassert>
#include <stdlib.h> #include <stdlib.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <glad/glad.h>
#define CONST_READSHADER_MAX_FN_LEN 256 #define CONST_READSHADER_MAX_FN_LEN 256
#define CONST_READSHADER_MAX_FN_SIZE 32*1024 #define CONST_READSHADER_MAX_FN_SIZE 32*1024
char *readshader(const char *fn) { int readshader(const char *fn, GLchar** pshdr_source) {
char shader_fn[CONST_READSHADER_MAX_FN_LEN]; char shader_fn[CONST_READSHADER_MAX_FN_LEN];
assert(strlen(fn) + 9 < CONST_READSHADER_MAX_FN_LEN); assert(strlen(fn) + 9 < CONST_READSHADER_MAX_FN_LEN);
struct stat status_buffer; struct stat status_buffer;
snprintf(shader_fn, CONST_READSHADER_MAX_FN_LEN, "shaders/%s", fn); GLchar *shdr_source;
snprintf(shader_fn, CONST_READSHADER_MAX_FN_LEN, "res/shaders/%s", fn);
printf("%s\n", shader_fn); printf("%s\n", shader_fn);
if (stat(shader_fn, &status_buffer) == -1) { if (stat(shader_fn, &status_buffer) == -1) {
printf("Failed to stat file '%s'\n", shader_fn); printf("Failed to stat file '%s'\n", shader_fn);
return NULL; return 0;
} }
assert(status_buffer.st_size < CONST_READSHADER_MAX_FN_SIZE-1); assert(status_buffer.st_size < CONST_READSHADER_MAX_FN_SIZE-1);
FILE *fh = fopen(shader_fn, "r"); FILE *fh = fopen(shader_fn, "r");
assert(fh != NULL); assert(fh != NULL);
char *shader_data = (char *)malloc(CONST_READSHADER_MAX_FN_SIZE); shdr_source = (GLchar *)malloc(CONST_READSHADER_MAX_FN_SIZE);
assert(shader_data != NULL); assert(shdr_source != NULL);
size_t read_bytes = fread((void *)shader_data, sizeof(char), size_t read_bytes = fread((void *)shdr_source, sizeof(char),
CONST_READSHADER_MAX_FN_SIZE-1, fh); CONST_READSHADER_MAX_FN_SIZE-1, fh);
assert(read_bytes < CONST_READSHADER_MAX_FN_SIZE-1); assert(read_bytes < CONST_READSHADER_MAX_FN_SIZE-1);
shader_data[read_bytes] = '\0'; shdr_source[read_bytes] = '\0';
puts(shdr_source);
fclose(fh); fclose(fh);
assert(shdr_source != NULL);
return shader_data;
*pshdr_source = shdr_source;
return 0;
} }
void freeshader(void *shader_fh) { void freeshader(void *pshdr_source) {
assert(shader_fh != NULL); assert(pshdr_source != NULL);
free(shader_fh); free(pshdr_source);
} }

View file

@ -1,4 +1,5 @@
#include <glad/glad.h>
char *readshader(const char *fn); int readshader(const char *fn, GLchar **pshdr_source);
void freeshader(void *shader_fh); void freeshader(void *pshdr_source);