mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
Allow creating shaders from source strings directly
This commit is contained in:
+2
-1
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user