summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/d3d/d3dhlsl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/d3d/d3dhlsl.cpp')
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp209
1 files changed, 96 insertions, 113 deletions
diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp
index 9dcb3f06f8e..be7138bfe6f 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.cpp
+++ b/src/osd/modules/render/d3d/d3dhlsl.cpp
@@ -43,23 +43,13 @@ static void get_vector(const char *data, int count, float *out, bool report_erro
//============================================================
shaders::shaders() :
- d3dintf(nullptr), machine(nullptr), d3d(nullptr), num_screens(0), curr_screen(0),
- avi_output_file(nullptr), avi_frame(0), avi_copy_surface(nullptr), avi_copy_texture(nullptr), avi_final_target(nullptr), avi_final_texture(nullptr),
+ d3dintf(nullptr), machine(nullptr), d3d(nullptr), post_fx_enable(false), oversampling_enable(false), paused(true), num_screens(0), curr_screen(0), lastidx(-1),
+ shadow_texture(nullptr), options(nullptr), avi_output_file(nullptr), avi_frame(0), avi_copy_surface(nullptr), avi_copy_texture(nullptr), avi_final_target(nullptr), avi_final_texture(nullptr),
black_surface(nullptr), black_texture(nullptr), render_snap(false), snap_rendered(false), snap_copy_target(nullptr), snap_copy_texture(nullptr), snap_target(nullptr), snap_texture(nullptr),
- snap_width(0), snap_height(0), lines_pending(false), backbuffer(nullptr), curr_effect(nullptr), default_effect(nullptr), prescale_effect(nullptr), post_effect(nullptr), distortion_effect(nullptr),
- focus_effect(nullptr), phosphor_effect(nullptr), deconverge_effect(nullptr), color_effect(nullptr), ntsc_effect(nullptr), bloom_effect(nullptr),
- downsample_effect(nullptr), vector_effect(nullptr), fsfx_vertices(nullptr), curr_texture(nullptr), curr_render_target(nullptr), curr_poly(nullptr)
+ snap_width(0), snap_height(0), lines_pending(false), initialized(false), backbuffer(nullptr), curr_effect(nullptr), default_effect(nullptr), prescale_effect(nullptr), post_effect(nullptr),
+ distortion_effect(nullptr), focus_effect(nullptr), phosphor_effect(nullptr), deconverge_effect(nullptr), color_effect(nullptr), ntsc_effect(nullptr), bloom_effect(nullptr),
+ downsample_effect(nullptr), vector_effect(nullptr), fsfx_vertices(nullptr), curr_texture(nullptr), curr_render_target(nullptr), curr_poly(nullptr), targethead(nullptr), cachehead(nullptr)
{
- master_enable = false;
- vector_enable = true;
- oversampling_enable = false;
- shadow_texture = nullptr;
- options = nullptr;
- paused = true;
- lastidx = -1;
- targethead = nullptr;
- cachehead = nullptr;
- initialized = false;
}
@@ -74,6 +64,12 @@ shaders::~shaders()
delete slider;
}
+ if (options != nullptr)
+ {
+ global_free(options);
+ options = nullptr;
+ }
+
cache_target *currcache = cachehead;
while(cachehead != nullptr)
{
@@ -98,7 +94,7 @@ shaders::~shaders()
void shaders::window_save()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -130,7 +126,7 @@ void shaders::window_save()
void shaders::window_record()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -155,7 +151,7 @@ void shaders::window_record()
void shaders::avi_update_snap(IDirect3DSurface9 *surface)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -208,7 +204,7 @@ void shaders::avi_update_snap(IDirect3DSurface9 *surface)
void shaders::render_snapshot(IDirect3DSurface9 *surface)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -310,7 +306,7 @@ void shaders::render_snapshot(IDirect3DSurface9 *surface)
void shaders::record_texture()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -353,7 +349,7 @@ void shaders::record_texture()
void shaders::end_avi_recording()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -369,52 +365,12 @@ void shaders::end_avi_recording()
//============================================================
-// shaders::toggle
-//============================================================
-
-void shaders::toggle(std::vector<ui::menu_item>& sliders)
-{
- if (master_enable)
- {
- if (initialized)
- {
- // free shader resources before renderer resources
- delete_resources(false);
- }
-
- master_enable = !master_enable;
-
- // free shader resources and re-create
- d3d->device_delete_resources();
- d3d->device_create_resources();
- }
- else
- {
- master_enable = !master_enable;
-
- // free shader resources and re-create
- d3d->device_delete_resources();
- d3d->device_create_resources();
-
- if (!initialized)
- {
- // re-create shader resources after renderer resources
- bool failed = create_resources(false, sliders);
- if (failed)
- {
- master_enable = false;
- }
- }
- }
-}
-
-//============================================================
// shaders::begin_avi_recording
//============================================================
void shaders::begin_avi_recording(const char *name)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -573,7 +529,7 @@ void shaders::remove_render_target(d3d_render_target *rt)
void shaders::set_texture(texture_info *texture)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -602,53 +558,64 @@ void shaders::set_texture(texture_info *texture)
// shaders::init
//============================================================
-void shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *renderer)
+bool shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *renderer)
{
- d3dx9_dll = osd::dynamic_module::open({ "d3dx9_43.dll" });
+ osd_printf_verbose("Direct3D: Initialize HLSL\n");
- d3dx_create_effect_from_file_ptr = d3dx9_dll->bind<d3dx_create_effect_from_file_fn>("D3DXCreateEffectFromFileW");
- if (!d3dx_create_effect_from_file_ptr)
+ if (initialized)
{
- osd_printf_verbose("Direct3D: Unable to find D3DXCreateEffectFromFileW\n");
- d3dintf->post_fx_available = false;
- return;
+ return false;
}
- d3dintf->post_fx_available = true;
- this->d3dintf = d3dintf;
- this->machine = machine;
- this->d3d = renderer;
- this->options = renderer->get_shaders_options();
-
// check if no driver loaded (not all settings might be loaded yet)
if (&machine->system() == &GAME_NAME(___empty))
{
- return;
+ return false;
}
- // check if another driver is loaded
+ // check if another driver is loaded and reset last options
if (std::strcmp(machine->system().name, last_system_name) != 0)
{
strncpy(last_system_name, machine->system().name, sizeof(last_system_name));
- options->params_init = false;
last_options.params_init = false;
}
+ d3dx9_dll = osd::dynamic_module::open({ "d3dx9_43.dll" });
+
+ d3dx_create_effect_from_file_ptr = d3dx9_dll->bind<d3dx_create_effect_from_file_fn>("D3DXCreateEffectFromFileW");
+ if (!d3dx_create_effect_from_file_ptr)
+ {
+ osd_printf_verbose("Direct3D: Unable to find D3DXCreateEffectFromFileW\n");
+ return false;
+ }
+
+ d3dintf->post_fx_available = true;
+
+ this->d3dintf = d3dintf;
+ this->machine = machine;
+ this->d3d = renderer;
+
enumerate_screens();
windows_options &winoptions = downcast<windows_options &>(machine->options());
- master_enable = winoptions.d3d_hlsl_enable();
+ post_fx_enable = winoptions.d3d_hlsl_enable();
oversampling_enable = winoptions.d3d_hlsl_oversampling();
snap_width = winoptions.d3d_snap_width();
snap_height = winoptions.d3d_snap_height();
+ this->options = (hlsl_options*)global_alloc_clear<hlsl_options>();
+ this->options->params_init = false;
+
+ // copy last options if initialized
if (last_options.params_init)
{
+ osd_printf_verbose("Direct3D: First restore options\n");
options = &last_options;
}
+ // read options if not initialized
if (!options->params_init)
{
strncpy(options->shadow_mask_texture, winoptions.screen_shadow_mask_texture(), sizeof(options->shadow_mask_texture));
@@ -719,9 +686,19 @@ void shaders::init(d3d_base *d3dintf, running_machine *machine, renderer_d3d9 *r
options->bloom_level8_weight = winoptions.screen_bloom_lvl8_weight();
options->params_init = true;
+
+ osd_printf_verbose("Direct3D: First store options\n");
+ last_options = *options;
+ options = &last_options;
}
options->params_dirty = true;
+
+ initialized = true;
+
+ osd_printf_verbose("Direct3D: HLSL initialized\n");
+
+ return true;
}
@@ -734,7 +711,7 @@ void shaders::init_fsfx_quad(void *vertbuf)
// Called at the start of each frame by the D3D code in order to reserve two triangles
// that are guaranteed to be at a fixed position so as to simply use D3DPT_TRIANGLELIST, 0, 2
// instead of having to do bookkeeping about a specific screen quad
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -805,15 +782,16 @@ void shaders::init_fsfx_quad(void *vertbuf)
// shaders::create_resources
//============================================================
-int shaders::create_resources(bool reset, std::vector<ui::menu_item>& sliders)
+int shaders::create_resources()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!initialized || !enabled())
{
return 0;
}
if (last_options.params_init)
{
+ osd_printf_verbose("Direct3D: Restore options\n");
options = &last_options;
}
@@ -982,11 +960,6 @@ int shaders::create_resources(bool reset, std::vector<ui::menu_item>& sliders)
distortion_effect->add_uniform("SmoothBorderAmount", uniform::UT_FLOAT, uniform::CU_POST_SMOOTH_BORDER);
distortion_effect->add_uniform("ReflectionAmount", uniform::UT_FLOAT, uniform::CU_POST_REFLECTION);
- initialized = true;
-
- std::vector<ui::menu_item> my_sliders = init_slider_list();
- sliders.insert(sliders.end(), my_sliders.begin(), my_sliders.end());
-
return 0;
}
@@ -997,7 +970,7 @@ int shaders::create_resources(bool reset, std::vector<ui::menu_item>& sliders)
void shaders::begin_draw()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -1094,7 +1067,7 @@ void shaders::blit(
void shaders::end_frame()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -1587,7 +1560,7 @@ void shaders::ui_pass(poly_info *poly, int vertnum)
void shaders::render_quad(poly_info *poly, int vertnum)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -1644,7 +1617,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
curr_screen++;
}
- else if (PRIMFLAG_GET_VECTOR(poly->get_flags()) && vector_enable)
+ else if (PRIMFLAG_GET_VECTOR(poly->get_flags()))
{
lines_pending = true;
@@ -1673,7 +1646,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
osd_printf_verbose("Direct3D: Error %08lX during device SetRenderTarget call\n", result);
}
}
- else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable)
+ else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()))
{
curr_screen = curr_screen < num_screens ? curr_screen : 0;
@@ -1748,7 +1721,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
void shaders::end_draw()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return;
}
@@ -1790,6 +1763,11 @@ bool shaders::add_cache_target(renderer_d3d9* d3d, texture_info* texture, int so
d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_info *texture)
{
+ if (!enabled())
+ {
+ return nullptr;
+ }
+
auto win = d3d->assert_window();
int target_width = int(prim->get_quad_width() + 0.5f);
@@ -1810,7 +1788,7 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i
// check if the size of the screen quad has changed
if (target->target_width != target_width || target->target_height != target_height)
{
- osd_printf_verbose("get_texture_target() - invalid size\n");
+ osd_printf_verbose("Direct3D: Get texture target - invalid size\n");
return nullptr;
}
}
@@ -1821,7 +1799,7 @@ d3d_render_target* shaders::get_texture_target(render_primitive *prim, texture_i
d3d_render_target* shaders::get_vector_target(render_primitive *prim)
{
- if (!vector_enable)
+ if (!enabled())
{
return nullptr;
}
@@ -1850,7 +1828,7 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim)
// check if the size of the screen quad has changed
if (target->target_width != target_width || target->target_height != target_height)
{
- osd_printf_verbose("get_vector_target() - invalid size\n");
+ osd_printf_verbose("Direct3D: Get vector target - invalid size\n");
return nullptr;
}
}
@@ -1859,8 +1837,13 @@ d3d_render_target* shaders::get_vector_target(render_primitive *prim)
return target;
}
-void shaders::create_vector_target(render_primitive *prim)
+bool shaders::create_vector_target(render_primitive *prim)
{
+ if (!enabled())
+ {
+ return false;
+ }
+
auto win = d3d->assert_window();
// source and target size are the same for vector targets
@@ -1876,11 +1859,13 @@ void shaders::create_vector_target(render_primitive *prim)
std::swap(target_width, target_height);
}
- osd_printf_verbose("create_vector_target() - %d, %d\n", target_width, target_height);
+ osd_printf_verbose("Direct3D: Create vector target - %dx%d\n", target_width, target_height);
if (!add_render_target(d3d, prim, nullptr, source_width, source_height, target_width, target_height))
{
- vector_enable = false;
+ return false;
}
+
+ return true;
}
@@ -1966,7 +1951,7 @@ void shaders::enumerate_screens()
bool shaders::register_texture(render_primitive *prim, texture_info *texture)
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!enabled())
{
return false;
}
@@ -1985,7 +1970,7 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture)
std::swap(target_width, target_height);
}
- osd_printf_verbose("register_texture() - %d, %d\n", target_width, target_height);
+ osd_printf_verbose("Direct3D: Register texture - %dx%d\n", target_width, target_height);
if (!add_render_target(d3d, prim, texture, source_width, source_height, target_width, target_height))
{
return false;
@@ -1999,21 +1984,21 @@ bool shaders::register_texture(render_primitive *prim, texture_info *texture)
// shaders::delete_resources
//============================================================
-void shaders::delete_resources(bool reset)
+void shaders::delete_resources()
{
- if (!master_enable || !d3dintf->post_fx_available)
+ if (!initialized || !enabled())
{
return;
}
+ end_avi_recording();
+
if (options != nullptr)
{
+ osd_printf_verbose("Direct3D: Store options\n");
last_options = *options;
- options = nullptr;
}
- initialized = false;
-
cache_target *currcache = cachehead;
while(cachehead != nullptr)
{
@@ -2490,9 +2475,9 @@ void *shaders::get_slider_option(int id, int index)
return nullptr;
}
-std::vector<ui::menu_item> shaders::init_slider_list()
+void shaders::init_slider_list()
{
- std::vector<ui::menu_item> sliders;
+ m_sliders.clear();
for (slider* slider : internal_sliders)
{
@@ -2503,7 +2488,7 @@ std::vector<ui::menu_item> shaders::init_slider_list()
auto first_screen = machine->first_screen();
if (first_screen == nullptr)
{
- return sliders;
+ return;
}
int screen_type = first_screen->screen_type();
@@ -2559,12 +2544,10 @@ std::vector<ui::menu_item> shaders::init_slider_list()
item.flags = 0;
item.ref = core_slider;
item.type = ui::menu_item_type::SLIDER;
- sliders.push_back(item);
+ m_sliders.push_back(item);
}
}
}
-
- return sliders;
}