(HLSL) Start adding renderchain code

This commit is contained in:
twinaphex 2018-05-14 20:42:28 +02:00
parent 111aeb46b3
commit 15f2cde260
2 changed files with 140 additions and 61 deletions

View File

@ -72,8 +72,8 @@ struct cg_pass
LPDIRECT3DTEXTURE9 tex; LPDIRECT3DTEXTURE9 tex;
LPDIRECT3DVERTEXBUFFER9 vertex_buf; LPDIRECT3DVERTEXBUFFER9 vertex_buf;
LPDIRECT3DVERTEXDECLARATION9 vertex_decl; LPDIRECT3DVERTEXDECLARATION9 vertex_decl;
CGprogram vPrg, fPrg;
void *attrib_map; void *attrib_map;
CGprogram vPrg, fPrg;
}; };
#define VECTOR_LIST_TYPE struct cg_pass #define VECTOR_LIST_TYPE struct cg_pass
@ -177,7 +177,7 @@ static bool d3d9_cg_load_program(void *data,
CGprofile fragment_profile = cgD3D9GetLatestPixelProfile(); CGprofile fragment_profile = cgD3D9GetLatestPixelProfile();
const char **fragment_opts = cgD3D9GetOptimalOptions(fragment_profile); const char **fragment_opts = cgD3D9GetOptimalOptions(fragment_profile);
const char **vertex_opts = cgD3D9GetOptimalOptions(vertex_profile); const char **vertex_opts = cgD3D9GetOptimalOptions(vertex_profile);
cg_renderchain_t *cg_data = (cg_renderchain_t*)data; cg_renderchain_t *chain = (cg_renderchain_t*)data;
if ( if (
fragment_profile == CG_PROFILE_UNKNOWN || fragment_profile == CG_PROFILE_UNKNOWN ||
@ -191,24 +191,24 @@ static bool d3d9_cg_load_program(void *data,
RARCH_LOG("[D3D9 Cg]: Fragment profile: %s\n", cgGetProfileString(fragment_profile)); RARCH_LOG("[D3D9 Cg]: Fragment profile: %s\n", cgGetProfileString(fragment_profile));
if (path_is_file && !string_is_empty(prog)) if (path_is_file && !string_is_empty(prog))
*fPrg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, *fPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
prog, fragment_profile, "main_fragment", fragment_opts); prog, fragment_profile, "main_fragment", fragment_opts);
else else
*fPrg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, stock_cg_d3d9_program, *fPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_cg_d3d9_program,
fragment_profile, "main_fragment", fragment_opts); fragment_profile, "main_fragment", fragment_opts);
list = cgGetLastListing(cg_data->cgCtx); list = cgGetLastListing(chain->cgCtx);
if (list) if (list)
listing_f = strdup(list); listing_f = strdup(list);
if (path_is_file && !string_is_empty(prog)) if (path_is_file && !string_is_empty(prog))
*vPrg = cgCreateProgramFromFile(cg_data->cgCtx, CG_SOURCE, *vPrg = cgCreateProgramFromFile(chain->cgCtx, CG_SOURCE,
prog, vertex_profile, "main_vertex", vertex_opts); prog, vertex_profile, "main_vertex", vertex_opts);
else else
*vPrg = cgCreateProgram(cg_data->cgCtx, CG_SOURCE, stock_cg_d3d9_program, *vPrg = cgCreateProgram(chain->cgCtx, CG_SOURCE, stock_cg_d3d9_program,
vertex_profile, "main_vertex", vertex_opts); vertex_profile, "main_vertex", vertex_opts);
list = cgGetLastListing(cg_data->cgCtx); list = cgGetLastListing(chain->cgCtx);
if (list) if (list)
listing_v = strdup(list); listing_v = strdup(list);
@ -625,61 +625,56 @@ static void d3d9_cg_renderchain_bind_pass(
} }
} }
static void d3d9_cg_deinit_progs(void *data) static void d3d9_cg_deinit_progs(cg_renderchain_t *chain)
{ {
unsigned i; unsigned i;
cg_renderchain_t *cg_data = (cg_renderchain_t*)data;
if (!cg_data)
return;
RARCH_LOG("[D3D9 Cg]: Destroying programs.\n"); RARCH_LOG("[D3D9 Cg]: Destroying programs.\n");
if (cg_data->passes->count >= 1) if (chain->passes->count >= 1)
{ {
d3d9_vertex_buffer_free(NULL, cg_data->passes->data[0].vertex_decl); d3d9_vertex_buffer_free(NULL, chain->passes->data[0].vertex_decl);
for (i = 1; i < cg_data->passes->count; i++) for (i = 1; i < chain->passes->count; i++)
{ {
if (cg_data->passes->data[i].tex) if (chain->passes->data[i].tex)
d3d9_texture_free(cg_data->passes->data[i].tex); d3d9_texture_free(chain->passes->data[i].tex);
cg_data->passes->data[i].tex = NULL; chain->passes->data[i].tex = NULL;
d3d9_vertex_buffer_free( d3d9_vertex_buffer_free(
cg_data->passes->data[i].vertex_buf, chain->passes->data[i].vertex_buf,
cg_data->passes->data[i].vertex_decl); chain->passes->data[i].vertex_decl);
if (cg_data->passes->data[i].fPrg) if (chain->passes->data[i].fPrg)
cgDestroyProgram(cg_data->passes->data[i].fPrg); cgDestroyProgram(chain->passes->data[i].fPrg);
if (cg_data->passes->data[i].vPrg) if (chain->passes->data[i].vPrg)
cgDestroyProgram(cg_data->passes->data[i].vPrg); cgDestroyProgram(chain->passes->data[i].vPrg);
} }
} }
if (cg_data->fStock) if (chain->fStock)
cgDestroyProgram(cg_data->fStock); cgDestroyProgram(chain->fStock);
if (cg_data->vStock) if (chain->vStock)
cgDestroyProgram(cg_data->vStock); cgDestroyProgram(chain->vStock);
} }
static void d3d9_cg_destroy_resources(void *data) static void d3d9_cg_destroy_resources(cg_renderchain_t *chain)
{ {
unsigned i; unsigned i;
cg_renderchain_t *cg_data = (cg_renderchain_t*)data;
for (i = 0; i < TEXTURES; i++) for (i = 0; i < TEXTURES; i++)
{ {
if (cg_data->prev.tex[i]) if (chain->prev.tex[i])
d3d9_texture_free(cg_data->prev.tex[i]); d3d9_texture_free(chain->prev.tex[i]);
if (cg_data->prev.vertex_buf[i]) if (chain->prev.vertex_buf[i])
d3d9_vertex_buffer_free(cg_data->prev.vertex_buf[i], NULL); d3d9_vertex_buffer_free(chain->prev.vertex_buf[i], NULL);
} }
d3d9_cg_deinit_progs(cg_data); d3d9_cg_deinit_progs(chain);
for (i = 0; i < cg_data->luts->count; i++) for (i = 0; i < chain->luts->count; i++)
{ {
if (cg_data->luts->data[i].tex) if (chain->luts->data[i].tex)
d3d9_texture_free(cg_data->luts->data[i].tex); d3d9_texture_free(chain->luts->data[i].tex);
} }
cgD3D9UnloadAllPrograms(); cgD3D9UnloadAllPrograms();
@ -688,50 +683,52 @@ static void d3d9_cg_destroy_resources(void *data)
static void d3d9_cg_deinit_context_state(void *data) static void d3d9_cg_deinit_context_state(void *data)
{ {
cg_renderchain_t *cg_data = (cg_renderchain_t*)data; cg_renderchain_t *chain = (cg_renderchain_t*)data;
if (cg_data->cgCtx)
if (chain->cgCtx)
{ {
RARCH_LOG("[D3D9 Cg]: Destroying context.\n"); RARCH_LOG("[D3D9 Cg]: Destroying context.\n");
cgDestroyContext(cg_data->cgCtx); cgDestroyContext(chain->cgCtx);
} }
cg_data->cgCtx = NULL;
chain->cgCtx = NULL;
} }
void d3d9_cg_renderchain_free(void *data) void d3d9_cg_renderchain_free(void *data)
{ {
cg_renderchain_t *cg_data = (cg_renderchain_t*)data; cg_renderchain_t *chain = (cg_renderchain_t*)data;
if (!cg_data) if (!chain)
return; return;
d3d9_cg_destroy_resources(cg_data); d3d9_cg_destroy_resources(chain);
if (cg_data->passes) if (chain->passes)
{ {
unsigned i; unsigned i;
for (i = 0; i < cg_data->passes->count; i++) for (i = 0; i < chain->passes->count; i++)
{ {
if (cg_data->passes->data[i].attrib_map) if (chain->passes->data[i].attrib_map)
free(cg_data->passes->data[i].attrib_map); free(chain->passes->data[i].attrib_map);
} }
cg_pass_vector_list_free(cg_data->passes); cg_pass_vector_list_free(chain->passes);
cg_data->passes = NULL; chain->passes = NULL;
} }
lut_info_vector_list_free(cg_data->luts); lut_info_vector_list_free(chain->luts);
unsigned_vector_list_free(cg_data->bound_tex); unsigned_vector_list_free(chain->bound_tex);
unsigned_vector_list_free(cg_data->bound_vert); unsigned_vector_list_free(chain->bound_vert);
cg_data->luts = NULL; chain->luts = NULL;
cg_data->bound_tex = NULL; chain->bound_tex = NULL;
cg_data->bound_vert = NULL; chain->bound_vert = NULL;
d3d9_cg_deinit_context_state(cg_data); d3d9_cg_deinit_context_state(chain);
free(cg_data); free(chain);
} }
static void *d3d9_cg_renderchain_new(void) static void *d3d9_cg_renderchain_new(void)

View File

@ -22,7 +22,6 @@
#include <d3d9.h> #include <d3d9.h>
#include "d3d9_renderchain.h"
#include "../../defines/d3d_defines.h" #include "../../defines/d3d_defines.h"
#include "../common/d3d_common.h" #include "../common/d3d_common.h"
#include "../common/d3d9_common.h" #include "../common/d3d9_common.h"
@ -41,8 +40,17 @@ struct hlsl_pass
LPDIRECT3DTEXTURE9 tex; LPDIRECT3DTEXTURE9 tex;
LPDIRECT3DVERTEXBUFFER9 vertex_buf; LPDIRECT3DVERTEXBUFFER9 vertex_buf;
LPDIRECT3DVERTEXDECLARATION9 vertex_decl; LPDIRECT3DVERTEXDECLARATION9 vertex_decl;
void *attrib_map;
}; };
#define VECTOR_LIST_TYPE struct hlsl_pass
#define VECTOR_LIST_NAME hlsl_pass
#include "../../libretro-common/lists/vector_list.c"
#undef VECTOR_LIST_TYPE
#undef VECTOR_LIST_NAME
#include "d3d9_renderchain.h"
typedef struct hlsl_d3d9_renderchain typedef struct hlsl_d3d9_renderchain
{ {
unsigned pixel_size; unsigned pixel_size;
@ -202,13 +210,82 @@ static void hlsl_d3d9_renderchain_set_vertices(
video_shader_driver_set_parameters(&params); video_shader_driver_set_parameters(&params);
} }
static void d3d9_hlsl_deinit_progs(hlsl_d3d9_renderchain_t *chain)
{
RARCH_LOG("[D3D9 HLSL]: Destroying programs.\n");
if (chain->passes->count >= 1)
{
unsigned i;
d3d9_vertex_buffer_free(NULL, chain->passes->data[0].vertex_decl);
for (i = 1; i < chain->passes->count; i++)
{
if (chain->passes->data[i].tex)
d3d9_texture_free(chain->passes->data[i].tex);
chain->passes->data[i].tex = NULL;
d3d9_vertex_buffer_free(
chain->passes->data[i].vertex_buf,
chain->passes->data[i].vertex_decl);
}
}
}
static void d3d9_hlsl_destroy_resources(hlsl_d3d9_renderchain_t *chain)
{
unsigned i;
for (i = 0; i < TEXTURES; i++)
{
if (chain->prev.tex[i])
d3d9_texture_free(chain->prev.tex[i]);
if (chain->prev.vertex_buf[i])
d3d9_vertex_buffer_free(chain->prev.vertex_buf[i], NULL);
}
d3d9_hlsl_deinit_progs(chain);
for (i = 0; i < chain->luts->count; i++)
{
if (chain->luts->data[i].tex)
d3d9_texture_free(chain->luts->data[i].tex);
}
}
static void hlsl_d3d9_renderchain_free(void *data) static void hlsl_d3d9_renderchain_free(void *data)
{ {
unsigned i;
hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)data; hlsl_d3d9_renderchain_t *chain = (hlsl_d3d9_renderchain_t*)data;
if (!chain) if (!chain)
return; return;
d3d9_hlsl_destroy_resources(chain);
if (chain->passes)
{
unsigned i;
for (i = 0; i < chain->passes->count; i++)
{
if (chain->passes->data[i].attrib_map)
free(chain->passes->data[i].attrib_map);
}
hlsl_pass_vector_list_free(chain->passes);
chain->passes = NULL;
}
lut_info_vector_list_free(chain->luts);
unsigned_vector_list_free(chain->bound_tex);
unsigned_vector_list_free(chain->bound_vert);
chain->luts = NULL;
chain->bound_tex = NULL;
chain->bound_vert = NULL;
d3d9_texture_free(chain->tex); d3d9_texture_free(chain->tex);
d3d9_vertex_buffer_free(chain->vertex_buf, chain->vertex_decl); d3d9_vertex_buffer_free(chain->vertex_buf, chain->vertex_decl);
free(chain); free(chain);
@ -221,6 +298,11 @@ void *hlsl_d3d9_renderchain_new(void)
if (!renderchain) if (!renderchain)
return NULL; return NULL;
renderchain->passes = hlsl_pass_vector_list_new();
renderchain->luts = lut_info_vector_list_new();
renderchain->bound_tex = unsigned_vector_list_new();
renderchain->bound_vert = unsigned_vector_list_new();
return renderchain; return renderchain;
} }