From 699f2dba1eb3ee843b176cc12fa73518255b0a98 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 9 Jan 2016 02:02:02 +0100 Subject: [PATCH] (D3D) N/A --- gfx/d3d/render_chain_cg.cpp | 52 ++++++++++++++++++------------- gfx/drivers_shader/shader_gl_cg.c | 10 +++--- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/gfx/d3d/render_chain_cg.cpp b/gfx/d3d/render_chain_cg.cpp index a728fd76ce..9c353076c4 100644 --- a/gfx/d3d/render_chain_cg.cpp +++ b/gfx/d3d/render_chain_cg.cpp @@ -187,56 +187,64 @@ static INLINE CGparameter find_param_from_semantic( return NULL; } -static bool renderchain_compile_shaders(cg_renderchain_t *chain, +#define CG_D3D_SET_LISTING(cg_data, type) \ +{ \ + const char *list = cgGetLastListing(cg_data->cgCtx); \ + if (list) \ + listing_##type = strdup(list); \ +} + +static bool renderchain_compile_shaders(void *data, void *fragment_data, void *vertex_data, const std::string &shader) { + char *listing_f = NULL; + char *listing_v = NULL; CGprogram *fPrg = (CGprogram*)fragment_data; CGprogram *vPrg = (CGprogram*)vertex_data; CGprofile vertex_profile = cgD3D9GetLatestVertexProfile(); CGprofile fragment_profile = cgD3D9GetLatestPixelProfile(); const char **fragment_opts = cgD3D9GetOptimalOptions(fragment_profile); const char **vertex_opts = cgD3D9GetOptimalOptions(vertex_profile); + cg_renderchain_t *cg_data = (cg_renderchain_t*)data; RARCH_LOG("[D3D Cg]: Vertex profile: %s\n", cgGetProfileString(vertex_profile)); RARCH_LOG("[D3D Cg]: Fragment profile: %s\n", cgGetProfileString(fragment_profile)); if (shader.length() > 0) { - RARCH_LOG("[D3D Cg]: Compiling shader: %s.\n", shader.c_str()); - *fPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE, + *fPrg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, shader.c_str(), fragment_profile, "main_fragment", fragment_opts); - - if (cgGetLastListing(chain->cgCtx)) - RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(chain->cgCtx)); - - *vPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE, + CG_D3D_SET_LISTING(cg_data, f); + *vPrg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, shader.c_str(), vertex_profile, "main_vertex", vertex_opts); - - if (cgGetLastListing(chain->cgCtx)) - RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(chain->cgCtx)); + CG_D3D_SET_LISTING(cg_data, v); } else { - RARCH_LOG("[D3D Cg]: Compiling stock shader.\n"); - - *fPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_program, + *fPrg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, stock_program, fragment_profile, "main_fragment", fragment_opts); - - if (cgGetLastListing(chain->cgCtx)) - RARCH_ERR("[D3D Cg]: Fragment error:\n%s\n", cgGetLastListing(chain->cgCtx)); - - *vPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_program, + CG_D3D_SET_LISTING(cg_data, f); + *vPrg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, stock_program, vertex_profile, "main_vertex", vertex_opts); - - if (cgGetLastListing(chain->cgCtx)) - RARCH_ERR("[D3D Cg]: Vertex error:\n%s\n", cgGetLastListing(chain->cgCtx)); + CG_D3D_SET_LISTING(cg_data, v); } if (!fPrg || !vPrg) + { + RARCH_ERR("CG error: %s\n", cgGetErrorString(cgGetError())); + if (listing_f) + RARCH_ERR("Fragment:\n%s\n", listing_f); + else if (listing_v) + RARCH_ERR("Vertex:\n%s\n", listing_v); + free(listing_f); + free(listing_v); return false; + } cgD3D9LoadProgram(*fPrg, true, 0); cgD3D9LoadProgram(*vPrg, true, 0); + free(listing_f); + free(listing_v); return true; } diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 9812b383c8..89363acb72 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -449,7 +449,7 @@ static void gl_cg_deinit(void *data) free(cg_data); } -#define SET_LISTING(cg_data, type) \ +#define CG_GL_SET_LISTING(cg_data, type) \ { \ const char *list = cgGetLastListing(cg_data->cgCtx); \ if (list) \ @@ -477,19 +477,19 @@ static bool gl_cg_load_program(void *data, unsigned idx, const char *prog, bool { cg_data->prg[idx].fprg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, prog, cg_data->cgFProf, "main_fragment", argv); - SET_LISTING(cg_data, f); + CG_GL_SET_LISTING(cg_data, f); cg_data->prg[idx].vprg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, prog, cg_data->cgVProf, "main_vertex", argv); - SET_LISTING(cg_data, v); + CG_GL_SET_LISTING(cg_data, v); } else { cg_data->prg[idx].fprg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, prog, cg_data->cgFProf, "main_fragment", argv); - SET_LISTING(cg_data, f); + CG_GL_SET_LISTING(cg_data, f); cg_data->prg[idx].vprg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, prog, cg_data->cgVProf, "main_vertex", argv); - SET_LISTING(cg_data, v); + CG_GL_SET_LISTING(cg_data, v); } if (!cg_data->prg[idx].fprg || !cg_data->prg[idx].vprg)