mirror of
https://github.com/libretro/RetroArch
synced 2025-04-10 15:45:19 +00:00
(HLSL) Start adding renderchain code
This commit is contained in:
parent
111aeb46b3
commit
15f2cde260
@ -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)
|
||||||
|
@ -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(¶ms);
|
video_shader_driver_set_parameters(¶ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user