Improve error reporting in Cg.

This commit is contained in:
Themaister 2011-11-10 00:46:39 +01:00
parent 51721b4cb6
commit f3f4efe304

View File

@ -295,36 +295,45 @@ void gl_cg_deinit(void)
cgDestroyContext(cgCtx); cgDestroyContext(cgCtx);
} }
#define SET_LISTING_INDEX(type, index) \
{ \
const char *list = cgGetLastListing(cgCtx); \
if (list) \
listing_##type[index] = strdup(list); \
}
#define SET_LISTING(type) \
{ \
const char *list = cgGetLastListing(cgCtx); \
if (list) \
listing_##type = strdup(list); \
}
static bool load_plain(const char *path) static bool load_plain(const char *path)
{ {
SSNES_LOG("Loading Cg file: %s\n", path); SSNES_LOG("Loading Cg file: %s\n", path);
char *listing[3] = {NULL}; char *listing_v[3] = {NULL};
const char *list = NULL; char *listing_f[3] = {NULL};
prg[0].fprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_program, cgFProf, "main_fragment", 0); prg[0].fprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_program, cgFProf, "main_fragment", 0);
SET_LISTING_INDEX(f, 0);
prg[0].vprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_program, cgVProf, "main_vertex", 0); prg[0].vprg = cgCreateProgram(cgCtx, CG_SOURCE, stock_cg_program, cgVProf, "main_vertex", 0);
SET_LISTING_INDEX(v, 0);
list = cgGetLastListing(cgCtx);
if (list)
listing[0] = strdup(list);
prg[1].fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path, cgFProf, "main_fragment", 0); prg[1].fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path, cgFProf, "main_fragment", 0);
SET_LISTING_INDEX(f, 1);
prg[1].vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path, cgVProf, "main_vertex", 0); prg[1].vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path, cgVProf, "main_vertex", 0);
SET_LISTING_INDEX(v, 1);
list = cgGetLastListing(cgCtx);
if (list)
listing[1] = strdup(list);
if (*g_settings.video.second_pass_shader && g_settings.video.render_to_texture) if (*g_settings.video.second_pass_shader && g_settings.video.render_to_texture)
{ {
SSNES_LOG("Loading 2nd pass: %s\n", g_settings.video.second_pass_shader); SSNES_LOG("Loading 2nd pass: %s\n", g_settings.video.second_pass_shader);
prg[2].fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, g_settings.video.second_pass_shader, cgFProf, "main_fragment", 0); prg[2].fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, g_settings.video.second_pass_shader, cgFProf, "main_fragment", 0);
SET_LISTING_INDEX(f, 2);
prg[2].vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, g_settings.video.second_pass_shader, cgVProf, "main_vertex", 0); prg[2].vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, g_settings.video.second_pass_shader, cgVProf, "main_vertex", 0);
SET_LISTING_INDEX(v, 2);
list = cgGetLastListing(cgCtx);
if (list)
listing[2] = strdup(list);
cg_shader_num = 2; cg_shader_num = 2;
} }
else else
@ -339,8 +348,10 @@ static bool load_plain(const char *path)
{ {
CGerror err = cgGetError(); CGerror err = cgGetError();
SSNES_ERR("CG error: %s\n", cgGetErrorString(err)); SSNES_ERR("CG error: %s\n", cgGetErrorString(err));
if (listing[i]) if (listing_v[i])
SSNES_ERR("%s\n", listing[i]); SSNES_ERR("Vertex:\n%s\n", listing_v[i]);
if (listing_f[i])
SSNES_ERR("Fragment:\n%s\n", listing_f[i]);
goto error; goto error;
} }
@ -348,13 +359,19 @@ static bool load_plain(const char *path)
cgGLLoadProgram(prg[i].vprg); cgGLLoadProgram(prg[i].vprg);
} }
for (unsigned i = 0; i < 3; i++)
{
free(listing_v[i]);
free(listing_f[i]);
}
return true; return true;
error: error:
for (unsigned i = 0; i < 3; i++) for (unsigned i = 0; i < 3; i++)
{ {
if (listing[i]) free(listing_v[i]);
free(listing[i]); free(listing_f[i]);
} }
return false; return false;
} }
@ -846,19 +863,31 @@ static bool load_preset(const char *path)
SSNES_LOG("Loading Cg shader: \"%s\".\n", path_buf); SSNES_LOG("Loading Cg shader: \"%s\".\n", path_buf);
struct cg_program *prog = &prg[i + 1]; struct cg_program *prog = &prg[i + 1];
char *listing_f = NULL;
prog->fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path_buf, cgFProf, "main_fragment", 0); prog->fprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path_buf, cgFProf, "main_fragment", 0);
SET_LISTING(f);
char *listing_v = NULL;
prog->vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path_buf, cgVProf, "main_vertex", 0); prog->vprg = cgCreateProgramFromFile(cgCtx, CG_SOURCE, path_buf, cgVProf, "main_vertex", 0);
SET_LISTING(v);
if (!prog->fprg || !prog->vprg) if (!prog->fprg || !prog->vprg)
{ {
const char *listing = cgGetLastListing(cgCtx);
CGerror err = cgGetError(); CGerror err = cgGetError();
SSNES_ERR("CG error: %s\n", cgGetErrorString(err)); SSNES_ERR("CG error: %s\n", cgGetErrorString(err));
if (listing) if (listing_v)
SSNES_ERR("%s\n", listing); SSNES_ERR("Vertex:\n%s\n", listing_v);
if (listing_f)
SSNES_ERR("Fragment:\n%s\n", listing_f);
free(listing_f);
free(listing_v);
goto error; goto error;
} }
free(listing_f);
free(listing_v);
cgGLLoadProgram(prog->fprg); cgGLLoadProgram(prog->fprg);
cgGLLoadProgram(prog->vprg); cgGLLoadProgram(prog->vprg);
} }