Allow creating shaders from source strings directly

This commit is contained in:
Henrik Rydgard
2012-08-27 23:28:52 +02:00
parent 754dadfd05
commit f79111b217
4 changed files with 55 additions and 13 deletions
+2 -1
View File
@@ -52,8 +52,9 @@ typedef intptr_t ssize_t;
#endif // _WIN32
// Byteswapping
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#endif
inline uint8 swap8(uint8 _data) {return _data;}
+46 -12
View File
@@ -50,12 +50,35 @@ GLSLProgram *glsl_create(const char *vshader, const char *fshader) {
program->program_ = 0;
program->vsh_ = 0;
program->fsh_ = 0;
program->vshader_source = 0;
program->fshader_source = 0;
strcpy(program->name, vshader + strlen(vshader) - 15);
strcpy(program->vshader_filename, vshader);
strcpy(program->fshader_filename, fshader);
if (glsl_recompile(program)) {
active_programs.insert(program);
}
else
{
FLOG("Failed building GLSL program: %s %s", vshader, fshader);
}
register_gl_resource_holder(program);
return program;
}
GLSLProgram *glsl_create_source(const char *vshader_src, const char *fshader_src) {
GLSLProgram *program = new GLSLProgram();
program->program_ = 0;
program->vsh_ = 0;
program->fsh_ = 0;
program->vshader_source = vshader_src;
program->fshader_source = fshader_src;
strcpy(program->name, "[srcshader]");
strcpy(program->vshader_filename, "");
strcpy(program->fshader_filename, "");
if (glsl_recompile(program)) {
active_programs.insert(program);
}
register_gl_resource_holder(program);
return program;
}
@@ -93,28 +116,37 @@ bool glsl_recompile(GLSLProgram *program) {
program->fshader_mtime = fs.st_mtime;
else
program->fshader_mtime = 0;
char *vsh_src = 0, *fsh_src = 0;
size_t sz;
char *vsh_src = (char *)VFSReadFile(program->vshader_filename, &sz);
if (!vsh_src) {
ELOG("File missing: %s", vsh_src);
return false;
if (!program->vshader_source)
{
size_t sz;
vsh_src = (char *)VFSReadFile(program->vshader_filename, &sz);
if (!vsh_src) {
ELOG("File missing: %s", program->vshader_filename);
return false;
}
}
char *fsh_src = (char *)VFSReadFile(program->fshader_filename, &sz);
if (!fsh_src) {
ELOG("File missing: %s", fsh_src);
delete [] vsh_src;
return false;
if (!program->fshader_source)
{
size_t sz;
fsh_src = (char *)VFSReadFile(program->fshader_filename, &sz);
if (!fsh_src) {
ELOG("File missing: %s", program->fshader_filename);
delete [] vsh_src;
return false;
}
}
GLuint vsh = glCreateShader(GL_VERTEX_SHADER);
const GLchar *vsh_str = (const GLchar *)(vsh_src);
const GLchar *vsh_str = program->vshader_source ? program->vshader_source : (const GLchar *)(vsh_src);
if (!CompileShader(vsh_str, vsh, program->vshader_filename)) {
return false;
}
delete [] vsh_src;
const GLchar *fsh_str = (const GLchar *)(fsh_src);
const GLchar *fsh_str = program->fshader_source ? program->fshader_source : (const GLchar *)(fsh_src);
GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER);
if (!CompileShader(fsh_str, fsh, program->fshader_filename)) {
glDeleteShader(vsh);
@@ -138,6 +170,8 @@ bool glsl_recompile(GLSLProgram *program) {
glGetProgramInfoLog(prog, bufLength, NULL, buf);
FLOG("Could not link program:\n %s", buf);
delete [] buf; // we're dead!
} else {
FLOG("Could not link program.");
}
glDeleteShader(vsh);
glDeleteShader(fsh);
+5
View File
@@ -28,6 +28,8 @@ struct GLSLProgram : public GfxResourceHolder {
char name[16];
char vshader_filename[256];
char fshader_filename[256];
const char *vshader_source;
const char *fshader_source;
time_t vshader_mtime;
time_t fshader_mtime;
@@ -58,7 +60,10 @@ struct GLSLProgram : public GfxResourceHolder {
// C API, old skool
// From files (VFS)
GLSLProgram *glsl_create(const char *vshader_file, const char *fshader_file);
// Directly from source code
GLSLProgram *glsl_create_source(const char *vshader_src, const char *fshader_src);
void glsl_destroy(GLSLProgram *program);
// If recompilation of the program fails, the program is untouched and error messages
+2
View File
@@ -14,6 +14,7 @@
#pragma once
#include <list>
#include "base/basictypes.h"
#include "base/display.h"
@@ -25,6 +26,7 @@ public:
virtual ~Screen();
virtual void update(const InputState &input) = 0;
virtual void render() {}
virtual void dialogFinished(const Screen &dialog) {}
private:
DISALLOW_COPY_AND_ASSIGN(Screen);