diff options
Diffstat (limited to 'src/osd/windows/d3dhlsl.c')
-rw-r--r-- | src/osd/windows/d3dhlsl.c | 976 |
1 files changed, 462 insertions, 514 deletions
diff --git a/src/osd/windows/d3dhlsl.c b/src/osd/windows/d3dhlsl.c index 733725faa0b..8bca8f88f9d 100644 --- a/src/osd/windows/d3dhlsl.c +++ b/src/osd/windows/d3dhlsl.c @@ -83,7 +83,13 @@ // GLOBALS //============================================================ -static hlsl_options g_hlsl_presets[4] = +static slider_state *g_slider_list; +static file_error open_next(d3d::renderer *d3d, emu_file &file, const char *templ, const char *extension, int idx); + +namespace d3d +{ + +hlsl_options shaders::s_hlsl_presets[4] = { { // 25% Shadow mask, 50% Scanlines, 3% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation true, @@ -104,7 +110,9 @@ static hlsl_options g_hlsl_presets[4] = { 0.05f,0.05f,0.05f}, { 0.25f,0.25f,0.25f}, 1.2f, - false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0 + false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, + 0.0f, 0.1f, 0.9f, 4.0f, + 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 0% Scanlines, 3% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation true, @@ -125,7 +133,9 @@ static hlsl_options g_hlsl_presets[4] = { 0.05f,0.05f,0.05f}, { 0.25f,0.25f,0.25f}, 1.2f, - false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0 + false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, + 0.0f, 0.1f, 0.9f, 4.0f, + 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 0% Scanlines, 0% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation true, @@ -146,7 +156,9 @@ static hlsl_options g_hlsl_presets[4] = { 0.05f,0.05f,0.05f}, { 0.25f,0.25f,0.25f}, 1.2f, - false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0 + false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, + 0.0f, 0.1f, 0.9f, 4.0f, + 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, { // 25% Shadow mask, 100% Scanlines, 15% Pincushion, 3 defocus, 24-degree Tint Out, 1.5 Exponent, 5% Floor, 70% Phosphor Return, 80% Saturation, Bad Convergence true, @@ -167,28 +179,25 @@ static hlsl_options g_hlsl_presets[4] = { 0.05f,0.05f,0.05f}, { 0.7f, 0.7f, 0.7f}, 0.8f, - false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0 + false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, + 0.0f, 0.1f, 0.9f, 4.0f, + 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f }, }; -static slider_state *g_slider_list; - - - //============================================================ // PROTOTYPES //============================================================ static void get_vector(const char *data, int count, float *out, int report_error); -static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, const char *extension, int idx); //============================================================ -// hlsl_info constructor +// shader manager constructor //============================================================ -hlsl_info::hlsl_info() +shaders::shaders() { master_enable = false; vector_enable = true; @@ -209,10 +218,10 @@ hlsl_info::hlsl_info() //============================================================ -// hlsl_info destructor +// shaders destructor //============================================================ -hlsl_info::~hlsl_info() +shaders::~shaders() { global_free(options); } @@ -220,17 +229,17 @@ hlsl_info::~hlsl_info() //============================================================ -// hlsl_info::window_save +// shaders::window_save //============================================================ -void hlsl_info::window_save() +void shaders::window_save() { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - HRESULT result = (*d3dintf->device.create_texture)(d3d->device, snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture); + HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture); if (result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to init system-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result); @@ -238,7 +247,7 @@ void hlsl_info::window_save() } (*d3dintf->texture.get_surface_level)(snap_copy_texture, 0, &snap_copy_target); - result = (*d3dintf->device.create_texture)(d3d->device, snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture); + result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture); if (result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to init video-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result); @@ -253,10 +262,10 @@ void hlsl_info::window_save() //============================================================ -// hlsl_info::window_record +// shaders::window_record //============================================================ -void hlsl_info::window_record() +void shaders::window_record() { if (!master_enable || !d3dintf->post_fx_available) return; @@ -272,15 +281,15 @@ void hlsl_info::window_record() //============================================================ -// hlsl_info::avi_update_snap +// shaders::avi_update_snap //============================================================ -void hlsl_info::avi_update_snap(d3d_surface *surface) +void shaders::avi_update_snap(surface *surface) { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; D3DLOCKED_RECT rect; @@ -291,7 +300,7 @@ void hlsl_info::avi_update_snap(d3d_surface *surface) } // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, avi_copy_surface); + HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, avi_copy_surface); if (result != D3D_OK) { return; @@ -325,12 +334,12 @@ void hlsl_info::avi_update_snap(d3d_surface *surface) // hlsl_render_snapshot //============================================================ -void hlsl_info::render_snapshot(d3d_surface *surface) +void shaders::render_snapshot(surface *surface) { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; D3DLOCKED_RECT rect; @@ -343,7 +352,7 @@ void hlsl_info::render_snapshot(d3d_surface *surface) } // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, snap_copy_target); + HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, snap_copy_target); if (result != D3D_OK) { return; @@ -427,15 +436,15 @@ void hlsl_info::render_snapshot(d3d_surface *surface) //============================================================ -// hlsl_info::record_texture +// shaders::record_texture //============================================================ -void hlsl_info::record_texture() +void shaders::record_texture() { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_surface *surface = avi_final_target; + surface *surface = avi_final_target; // ignore if nothing to do if (avi_output_file == NULL || surface == NULL) @@ -466,10 +475,10 @@ void hlsl_info::record_texture() //============================================================ -// hlsl_info::end_hlsl_avi_recording +// shaders::end_hlsl_avi_recording //============================================================ -void hlsl_info::end_avi_recording() +void shaders::end_avi_recording() { if (!master_enable || !d3dintf->post_fx_available) return; @@ -483,10 +492,10 @@ void hlsl_info::end_avi_recording() //============================================================ -// hlsl_info::set_texture +// shaders::set_texture //============================================================ -void hlsl_info::toggle() +void shaders::toggle() { if (master_enable) { @@ -515,15 +524,15 @@ void hlsl_info::toggle() } //============================================================ -// hlsl_info::begin_avi_recording +// shaders::begin_avi_recording //============================================================ -void hlsl_info::begin_avi_recording(const char *name) +void shaders::begin_avi_recording(const char *name) { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; // stop any existing recording end_avi_recording(); @@ -593,7 +602,7 @@ void hlsl_info::begin_avi_recording(const char *name) // refcount hits zero //============================================================ -void hlsl_info::remove_cache_target(d3d_cache_target *cache) +void shaders::remove_cache_target(cache_target *cache) { if (cache != NULL) { @@ -621,21 +630,21 @@ void hlsl_info::remove_cache_target(d3d_cache_target *cache) // remove_render_target - remove an active target //============================================================ -void hlsl_info::remove_render_target(d3d_texture_info *texture) +void shaders::remove_render_target(texture_info *texture) { remove_render_target(find_render_target(texture)); } -void hlsl_info::remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) +void shaders::remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) { - d3d_render_target *target = find_render_target(width, height, screen_index, page_index); + render_target *target = find_render_target(width, height, screen_index, page_index); if (target != NULL) { remove_render_target(target); } } -void hlsl_info::remove_render_target(d3d_render_target *rt) +void shaders::remove_render_target(render_target *rt) { if (rt != NULL) { @@ -654,7 +663,7 @@ void hlsl_info::remove_render_target(d3d_render_target *rt) rt->next->prev = rt->prev; } - d3d_cache_target *cache = find_cache_target(rt->screen_index, rt->width, rt->height); + cache_target *cache = find_cache_target(rt->screen_index, rt->width, rt->height); if (cache != NULL) { remove_cache_target(cache); @@ -674,44 +683,37 @@ void hlsl_info::remove_render_target(d3d_render_target *rt) //============================================================ -// hlsl_info::set_texture +// shaders::set_texture //============================================================ -void hlsl_info::set_texture(d3d_texture_info *texture) +void shaders::set_texture(texture_info *texture) { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; if(texture != NULL) { - if(texture->prev_frame == texture->cur_frame) - { - paused = true; - } - else - { - paused = false; - } - - texture->prev_frame = texture->cur_frame; + paused = texture->paused(); + texture->advance_frame(); } - (*d3dintf->effect.set_texture)(effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + texture_info *default_texture = d3d->get_default_texture(); + (*d3dintf->effect.set_texture)(default_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex()); if (options->yiq_enable) - (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex()); else - (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); - (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex()); + (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex()); } //============================================================ -// hlsl_info::init +// shaders::init //============================================================ -void hlsl_info::init(d3d_base *d3dintf, win_window_info *window) +void shaders::init(base *d3dintf, win_window_info *window) { if (!d3dintf->post_fx_available) return; @@ -746,7 +748,7 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window) if(read_ini) { emu_file ini_file(downcast<windows_options &>(window->machine().options()).screen_post_fx_dir(), OPEN_FLAG_READ | OPEN_FLAG_CREATE_PATHS); - file_error filerr = open_next((d3d_info*)window->drawdata, ini_file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); + file_error filerr = open_next((renderer*)window->drawdata, ini_file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); read_ini = false; if (filerr == FILERR_NONE) @@ -962,7 +964,7 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window) } else { - options = &g_hlsl_presets[preset]; + options = &s_hlsl_presets[preset]; } options->yiq_enable = winoptions.screen_yiq_enable(); @@ -981,6 +983,17 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window) options->vector_time_period = winoptions.screen_vector_time_period(); options->vector_length_scale = winoptions.screen_vector_length_scale(); options->vector_length_ratio = winoptions.screen_vector_length_ratio(); + options->bloom_level0_weight = winoptions.screen_bloom_lvl0_weight(); + options->bloom_level1_weight = winoptions.screen_bloom_lvl1_weight(); + options->bloom_level2_weight = winoptions.screen_bloom_lvl2_weight(); + options->bloom_level3_weight = winoptions.screen_bloom_lvl3_weight(); + options->bloom_level4_weight = winoptions.screen_bloom_lvl4_weight(); + options->bloom_level5_weight = winoptions.screen_bloom_lvl5_weight(); + options->bloom_level6_weight = winoptions.screen_bloom_lvl6_weight(); + options->bloom_level7_weight = winoptions.screen_bloom_lvl7_weight(); + options->bloom_level8_weight = winoptions.screen_bloom_lvl8_weight(); + options->bloom_level9_weight = winoptions.screen_bloom_lvl9_weight(); + options->bloom_level10_weight = winoptions.screen_bloom_lvl10_weight(); } options->params_dirty = true; @@ -996,10 +1009,10 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window) //============================================================ -// hlsl_info::init_fsfx_quad +// shaders::init_fsfx_quad //============================================================ -void hlsl_info::init_fsfx_quad(void *vertbuf) +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 @@ -1007,26 +1020,26 @@ void hlsl_info::init_fsfx_quad(void *vertbuf) if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; // get a pointer to the vertex buffer - fsfx_vertices = (d3d_vertex *)vertbuf; + fsfx_vertices = (vertex *)vertbuf; if (fsfx_vertices == NULL) return; // fill in the vertexes clockwise fsfx_vertices[0].x = 0.0f; fsfx_vertices[0].y = 0.0f; - fsfx_vertices[1].x = d3d->width; + fsfx_vertices[1].x = d3d->get_width(); fsfx_vertices[1].y = 0.0f; fsfx_vertices[2].x = 0.0f; - fsfx_vertices[2].y = d3d->height; - fsfx_vertices[3].x = d3d->width; + fsfx_vertices[2].y = d3d->get_height(); + fsfx_vertices[3].x = d3d->get_width(); fsfx_vertices[3].y = 0.0f; fsfx_vertices[4].x = 0.0f; - fsfx_vertices[4].y = d3d->height; - fsfx_vertices[5].x = d3d->width; - fsfx_vertices[5].y = d3d->height; + fsfx_vertices[4].y = d3d->get_height(); + fsfx_vertices[5].x = d3d->get_width(); + fsfx_vertices[5].y = d3d->get_height(); fsfx_vertices[0].u0 = 0.0f; fsfx_vertices[0].v0 = 0.0f; @@ -1058,34 +1071,34 @@ void hlsl_info::init_fsfx_quad(void *vertbuf) //============================================================ -// hlsl_info::create_resources +// shaders::create_resources //============================================================ -int hlsl_info::create_resources(bool reset) +int shaders::create_resources(bool reset) { if (!master_enable || !d3dintf->post_fx_available) return 0; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - HRESULT result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer); + HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); - result = (*d3dintf->device.create_texture)(d3d->device, 4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture); + result = (*d3dintf->device.create_texture)(d3d->get_device(), 4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture); if (result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to init video-memory target for black texture (%08x)\n", (UINT32)result); return 1; } (*d3dintf->texture.get_surface_level)(black_texture, 0, &black_surface); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, black_surface); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, black_surface); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.create_texture)(d3d->device, (int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture); + result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture); if (result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to init system-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result); @@ -1093,7 +1106,7 @@ int hlsl_info::create_resources(bool reset) } (*d3dintf->texture.get_surface_level)(avi_copy_texture, 0, &avi_copy_surface); - result = (*d3dintf->device.create_texture)(d3d->device, (int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture); + result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture); if (result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to init video-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result); @@ -1115,7 +1128,7 @@ int hlsl_info::create_resources(bool reset) texture.seqid = 0; // now create it - shadow_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + shadow_texture = new texture_info(d3d->get_texture_manager(), &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); } const char *fx_dir = downcast<windows_options &>(window->machine().options()).screen_post_fx_dir(); @@ -1162,7 +1175,7 @@ int hlsl_info::create_resources(bool reset) TCHAR *yiq_decode_name = tstring_from_utf8(yiq_decode_name_cstr); // create the regular shader - result = (*d3dintf->device.create_effect)(d3d->device, primary_name, &effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), primary_name, &default_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load primary.fx\n"); @@ -1170,7 +1183,7 @@ int hlsl_info::create_resources(bool reset) } // create the post-processing shader - result = (*d3dintf->device.create_effect)(d3d->device, post_name, &post_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), post_name, &post_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load post.fx\n"); @@ -1178,7 +1191,7 @@ int hlsl_info::create_resources(bool reset) } // create the prescaling shader - result = (*d3dintf->device.create_effect)(d3d->device, prescale_name, &prescale_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), prescale_name, &prescale_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load prescale.fx\n"); @@ -1186,7 +1199,7 @@ int hlsl_info::create_resources(bool reset) } // create the pincushion shader - result = (*d3dintf->device.create_effect)(d3d->device, pincushion_name, &pincushion_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), pincushion_name, &pincushion_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load pincushion.fx\n"); @@ -1194,7 +1207,7 @@ int hlsl_info::create_resources(bool reset) } // create the phosphor shader - result = (*d3dintf->device.create_effect)(d3d->device, phosphor_name, &phosphor_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), phosphor_name, &phosphor_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load phosphor.fx\n"); @@ -1202,7 +1215,7 @@ int hlsl_info::create_resources(bool reset) } // create the focus shader - result = (*d3dintf->device.create_effect)(d3d->device, focus_name, &focus_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), focus_name, &focus_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load focus.fx\n"); @@ -1210,7 +1223,7 @@ int hlsl_info::create_resources(bool reset) } // create the deconvergence shader - result = (*d3dintf->device.create_effect)(d3d->device, deconverge_name, &deconverge_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), deconverge_name, &deconverge_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load deconverge.fx\n"); @@ -1218,7 +1231,7 @@ int hlsl_info::create_resources(bool reset) } // create the color convolution shader - result = (*d3dintf->device.create_effect)(d3d->device, color_name, &color_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), color_name, &color_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load color.fx\n"); @@ -1226,7 +1239,7 @@ int hlsl_info::create_resources(bool reset) } // create the YIQ modulation shader - result = (*d3dintf->device.create_effect)(d3d->device, yiq_encode_name, &yiq_encode_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), yiq_encode_name, &yiq_encode_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load yiq_encode.fx\n"); @@ -1234,20 +1247,19 @@ int hlsl_info::create_resources(bool reset) } // create the YIQ demodulation shader - result = (*d3dintf->device.create_effect)(d3d->device, yiq_decode_name, &yiq_decode_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), yiq_decode_name, &yiq_decode_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load yiq_decode.fx\n"); return 1; } - // create the vector shader -#if HLSL_VECTOR +#if HLSL_VECTOR || CRT_BLOOM char bloom_cstr[1024]; sprintf(bloom_cstr, "%s\\bloom.fx", fx_dir); TCHAR *bloom_name = tstring_from_utf8(bloom_cstr); - result = (*d3dintf->device.create_effect)(d3d->device, bloom_name, &bloom_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), bloom_name, &bloom_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load bloom.fx\n"); @@ -1260,7 +1272,7 @@ int hlsl_info::create_resources(bool reset) sprintf(downsample_cstr, "%s\\downsample.fx", fx_dir); TCHAR *downsample_name = tstring_from_utf8(downsample_cstr); - result = (*d3dintf->device.create_effect)(d3d->device, downsample_name, &downsample_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), downsample_name, &downsample_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load downsample.fx\n"); @@ -1268,12 +1280,14 @@ int hlsl_info::create_resources(bool reset) } if (downsample_name) osd_free(downsample_name); - +#endif +#if HLSL_VECTOR + // create the vector shader char vector_cstr[1024]; sprintf(vector_cstr, "%s\\vector.fx", fx_dir); TCHAR *vector_name = tstring_from_utf8(vector_cstr); - result = (*d3dintf->device.create_effect)(d3d->device, vector_name, &vector_effect); + result = (*d3dintf->device.create_effect)(d3d->get_device(), vector_name, &vector_effect); if(result != D3D_OK) { mame_printf_verbose("Direct3D: Unable to load vector.fx\n"); @@ -1311,19 +1325,19 @@ int hlsl_info::create_resources(bool reset) //============================================================ -// hlsl_info::begin_draw +// shaders::begin_draw //============================================================ -void hlsl_info::begin_draw() +void shaders::begin_draw() { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - curr_effect = effect; + curr_effect = default_effect; - (*d3dintf->effect.set_technique)(effect, "TestTechnique"); + (*d3dintf->effect.set_technique)(default_effect, "TestTechnique"); (*d3dintf->effect.set_technique)(post_effect, "ScanMaskTechnique"); (*d3dintf->effect.set_technique)(pincushion_effect, "TestTechnique"); (*d3dintf->effect.set_technique)(phosphor_effect, "TestTechnique"); @@ -1333,49 +1347,34 @@ void hlsl_info::begin_draw() (*d3dintf->effect.set_technique)(yiq_encode_effect, "EncodeTechnique"); (*d3dintf->effect.set_technique)(yiq_decode_effect, "DecodeTechnique"); - HRESULT result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer); + HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result); } //============================================================ -// hlsl_info::begin_frame +// shaders::begin_frame //============================================================ -void hlsl_info::begin_frame() +void shaders::begin_frame() { record_texture(); - - /*d3d_info *d3d = (d3d_info *)window->drawdata; - - d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); - if (rt == NULL) - { - return; - } - - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);*/ } //============================================================ -// hlsl_info::blit +// shaders::blit //============================================================ -void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D3DPRIMITIVETYPE prim_type, +void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count, int dstw, int dsth) { - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, dst); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - curr_effect = effect; + curr_effect = default_effect; (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src); @@ -1392,7 +1391,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, prim_type, prim_index, prim_count); + HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1401,7 +1400,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D if (new_dst) { - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, new_dst); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, new_dst); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); } } @@ -1409,31 +1408,27 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D //============================================================ -// hlsl_info::blit +// shaders::blit //============================================================ -void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D3DPRIMITIVETYPE prim_type, +void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count) { - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, dst); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0); + if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - curr_effect = effect; - - d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); - if (rt == NULL) - { - return; - } + curr_effect = default_effect; (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "ScreenWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "ScreenHeight", (float)d3d->height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); + (*d3dintf->effect.set_float)(curr_effect, "ScreenWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "ScreenHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "PostPass", 1.0f); (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion); (*d3dintf->effect.set_float)(curr_effect, "Brighten", 1.0f); @@ -1445,7 +1440,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, prim_type, prim_index, prim_count); + HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1456,16 +1451,16 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D if (new_dst) { - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, new_dst); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, new_dst); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); } } //============================================================ -// hlsl_info::end_frame +// shaders::end_frame //============================================================ -void hlsl_info::end_frame() +void shaders::end_frame() { if (!master_enable || !d3dintf->post_fx_available) return; @@ -1479,89 +1474,94 @@ void hlsl_info::end_frame() return; lines_pending = false; - /*d3d_info *d3d = (d3d_info *)window->drawdata; - - d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); - if (!rt) - return; - - blit(backbuffer, rt->texture[0], NULL, vecbuf_type, vecbuf_index, vecbuf_count);*/ - /*d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); + /*render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); if (rt == NULL) { return; } - blit(backbuffer, rt->texture[1], NULL, vecbuf_type, vecbuf_index, vecbuf_count); + blit(backbuffer, rt->render_texture[1], NULL, vecbuf_type, vecbuf_index, vecbuf_count); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);*/ } //============================================================ -// hlsl_info::init_effect_info +// shaders::init_effect_info //============================================================ -void hlsl_info::init_effect_info(d3d_poly_info *poly) +void shaders::init_effect_info(poly_info *poly) { if (!master_enable || !d3dintf->post_fx_available) return; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; + texture_info *texture = poly->get_texture(); - if(PRIMFLAG_GET_TEXSHADE(d3d->last_texture_flags)) + vec2f shadow_dims; + + if (shadow_texture) + { + shadow_dims = shadow_texture->get_rawdims(); + } + else + { + shadow_dims.c.x = 1.0f; + shadow_dims.c.y = 1.0f; + } + + if(PRIMFLAG_GET_TEXSHADE(d3d->get_last_texture_flags())) { curr_effect = pincushion_effect; } - else if(PRIMFLAG_GET_SCREENTEX(d3d->last_texture_flags) && poly->texture != NULL) + else if(PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && texture != NULL) { // Plug in all of the shader settings we're going to need // This is extremely slow, but we're not rendering models here, // just post-processing. curr_effect = post_effect; - (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset); + (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", d3d->height); + vec2f delta = texture->get_uvstop() - texture->get_uvstart(); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &texture->get_rawdims().c.x); + (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", d3d->get_height()); (*d3dintf->effect.set_vector)(curr_effect, "Floor", 3, options->floor); (*d3dintf->effect.set_float)(curr_effect, "SnapX", snap_width); (*d3dintf->effect.set_float)(curr_effect, "SnapY", snap_height); (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion); (*d3dintf->effect.set_float)(curr_effect, "CurvatureAmount", options->curvature); (*d3dintf->effect.set_float)(curr_effect, "UseShadow", shadow_texture == NULL ? 0.0f : 1.0f); - (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->get_finaltex()); (*d3dintf->effect.set_float)(curr_effect, "ShadowBrightness", options->shadow_mask_alpha); (*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeX", (float)options->shadow_mask_count_x); (*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeY", (float)options->shadow_mask_count_y); (*d3dintf->effect.set_float)(curr_effect, "ShadowU", options->shadow_mask_u_size); (*d3dintf->effect.set_float)(curr_effect, "ShadowV", options->shadow_mask_v_size); - (*d3dintf->effect.set_float)(curr_effect, "ShadowWidth", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "ShadowHeight", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawheight); + + (*d3dintf->effect.set_vector)(curr_effect, "ShadowDims", 2, &shadow_dims.c.x); (*d3dintf->effect.set_float)(curr_effect, "ScanlineAmount", options->scanline_alpha); (*d3dintf->effect.set_float)(curr_effect, "ScanlineScale", options->scanline_scale); (*d3dintf->effect.set_float)(curr_effect, "ScanlineHeight", options->scanline_height); (*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightScale", options->scanline_bright_scale); (*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightOffset", options->scanline_bright_offset); - //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset); + //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset); (*d3dintf->effect.set_vector)(curr_effect, "Power", 3, options->power); } } else { - curr_effect = effect; + curr_effect = default_effect; (*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f); } @@ -1569,18 +1569,18 @@ void hlsl_info::init_effect_info(d3d_poly_info *poly) //============================================================ -// hlsl_info::find_render_target +// shaders::find_render_target //============================================================ -d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info) +render_target* shaders::find_render_target(texture_info *info) { - d3d_render_target *curr = targethead; - - UINT32 screen_index_data = (UINT32)info->texinfo.osddata; + render_target *curr = targethead; + UINT32 screen_index_data = (UINT32)info->get_texinfo().osddata; UINT32 screen_index = screen_index_data >> 1; UINT32 page_index = screen_index_data & 1; - while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index || curr->width != info->texinfo.width || curr->height != info->texinfo.height)) + while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index || + curr->width != info->get_texinfo().width || curr->height != info->get_texinfo().height)) { curr = curr->next; } @@ -1590,12 +1590,12 @@ d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info) //============================================================ -// hlsl_info::find_render_target +// shaders::find_render_target //============================================================ -d3d_render_target* hlsl_info::find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) +render_target* shaders::find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) { - d3d_render_target *curr = targethead; + render_target *curr = targethead; while (curr != NULL && (curr->width != width || curr->height != height || curr->screen_index != screen_index || curr->page_index != page_index)) { @@ -1607,12 +1607,12 @@ d3d_render_target* hlsl_info::find_render_target(int width, int height, UINT32 s //============================================================ -// hlsl_info::find_cache_target +// shaders::find_cache_target //============================================================ -d3d_cache_target* hlsl_info::find_cache_target(UINT32 screen_index, int width, int height) +cache_target* shaders::find_cache_target(UINT32 screen_index, int width, int height) { - d3d_cache_target *curr = cachehead; + cache_target *curr = cachehead; while (curr != NULL && (curr->screen_index != screen_index || curr->width != width || curr->height != height)) { @@ -1624,42 +1624,44 @@ d3d_cache_target* hlsl_info::find_cache_target(UINT32 screen_index, int width, i //============================================================ -// hlsl_info::render_quad +// shaders::render_quad //============================================================ -void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) +void shaders::render_quad(poly_info *poly, int vertnum) { if (!master_enable || !d3dintf->post_fx_available) return; UINT num_passes = 0; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; + texture_info *texture = poly->get_texture(); - if(PRIMFLAG_GET_SCREENTEX(d3d->last_texture_flags) && poly->texture != NULL) + if(PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && texture != NULL) { - d3d_render_target *rt = find_render_target(poly->texture); + render_target *rt = find_render_target(texture); if (rt == NULL) { return; } - d3d_cache_target *ct = find_cache_target(rt->screen_index, poly->texture->texinfo.width, poly->texture->texinfo.height); + cache_target *ct = find_cache_target(rt->screen_index, texture->get_texinfo().width, texture->get_texinfo().height); + + vec2f& rawdims = texture->get_rawdims(); + vec2f delta = texture->get_uvstop() - texture->get_uvstart(); if(options->yiq_enable) { - /* Convert our signal into YIQ */ + // Convert our signal into YIQ curr_effect = yiq_encode_effect; if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); + (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc); (*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a); - (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b)); + (*d3dintf->effect.set_float)(curr_effect, "BValue", (texture->get_cur_frame() == 2) ? 0.0f : ((float)texture->get_cur_frame() * options->yiq_b)); (*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p); (*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n); (*d3dintf->effect.set_float)(curr_effect, "YFreqResponse", options->yiq_y); @@ -1668,10 +1670,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time); } - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[4]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[4]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1680,29 +1682,27 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - /* Convert our signal from YIQ */ + // Convert our signal from YIQ curr_effect = yiq_decode_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->texture[4]); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", poly->texture->d3dfinaltex); + (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->render_texture[4]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture->get_finaltex()); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); + (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc); (*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a); - (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b)); + (*d3dintf->effect.set_float)(curr_effect, "BValue", (texture->get_cur_frame() == 2) ? 0.0f : ((float)texture->get_cur_frame() * options->yiq_b)); (*d3dintf->effect.set_float)(curr_effect, "OValue", options->yiq_o); (*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p); (*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n); @@ -1712,10 +1712,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time); } - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[3]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[3]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1724,7 +1724,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1733,20 +1733,17 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) curr_effect = color_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[3]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[3]); } curr_effect = color_effect; - /* Render the initial color-convolution pass */ + // Render the initial color-convolution pass if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->ustop - poly->texture->ustart))); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->vstop - poly->texture->vstart))); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "YIQEnable", options->yiq_enable ? 1.0f : 0.0f); (*d3dintf->effect.set_vector)(curr_effect, "RedRatios", 3, options->red_ratio); (*d3dintf->effect.set_vector)(curr_effect, "GrnRatios", 3, options->grn_ratio); @@ -1756,10 +1753,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.set_float)(curr_effect, "Saturation", options->saturation); } - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->smalltarget); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->smalltarget); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1768,57 +1765,52 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - /* Pre-scaling pass */ + // Pre-scaling pass curr_effect = prescale_effect; (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->smalltexture); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); } (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->prescaletarget); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->prescaletarget); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - /* Deconverge pass */ + // Deconverge pass curr_effect = deconverge_effect; (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->prescaletexture); if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); + (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x); (*d3dintf->effect.set_vector)(curr_effect, "ConvergeX", 3, options->converge_x); (*d3dintf->effect.set_vector)(curr_effect, "ConvergeY", 3, options->converge_y); (*d3dintf->effect.set_vector)(curr_effect, "RadialConvergeX", 3, options->radial_converge_x); @@ -1827,16 +1819,16 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[2]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1848,59 +1840,51 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) bool focus_enable = defocus_x != 0.0f || defocus_y != 0.0f; if(focus_enable) { - /* Defocus pass 1 */ + // Defocus pass 1 curr_effect = focus_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[2]); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[0]); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - /* Defocus pass 2 */ + // Defocus pass 2 - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[1]); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 7\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1915,24 +1899,22 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); + //(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)rt->target_width); + //(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)rt->target_height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor); } (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)rt->target_width); (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)rt->target_height); (*d3dintf->effect.set_float)(curr_effect, "Passthrough", 0.0f); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? rt->texture[1] : rt->texture[2]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? rt->render_texture[1] : rt->render_texture[2]); (*d3dintf->effect.set_texture)(curr_effect, "LastPass", ct->last_texture); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 4\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1941,23 +1923,28 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - /* Pass along our phosphor'd screen */ + // Pass along our phosphor'd screen curr_effect = phosphor_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); - (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->texture[0]); + //(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + //(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); + //(*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->get_width()); + //(*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->get_height()); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->render_texture[0]); (*d3dintf->effect.set_float)(curr_effect, "Passthrough", 1.0f); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, ct->last_target); // Avoid changing targets due to page flipping + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, ct->last_target); // Avoid changing targets due to page flipping + //result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); // Avoid changing targets due to page flipping if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 5\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1966,7 +1953,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -1974,15 +1961,15 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.end)(curr_effect); curr_effect = post_effect; - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); - /* Scanlines and shadow mask, at high res for AVI logging*/ + // Scanlines and shadow mask, at high res for AVI logging if(avi_output_file != NULL) { - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, avi_final_target); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, avi_final_target); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -1991,7 +1978,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2001,9 +1988,9 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) if(render_snap) { - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, snap_target); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, snap_target); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -2012,7 +1999,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2022,18 +2009,32 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) snap_rendered = true; } - /* Scanlines and shadow mask */ + // Scanlines and shadow mask curr_effect = post_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); + //float raw_dims[2] = { d3d->get_width(), d3d->get_height() }; + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); + (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); + (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x); + d3d->set_wrap(D3DTADDRESS_MIRROR); + +#if CRT_BLOOM //(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)rt->target_width); //(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)rt->target_height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); -#if HLSL_VECTOR - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]); + + d3d->set_wrap(D3DTADDRESS_MIRROR); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0); + if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); #else - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); + + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); #endif if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); @@ -2043,23 +2044,25 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); -#if HLSL_VECTOR - /* Bloom */ + d3d->set_wrap(PRIMFLAG_GET_TEXWRAP(poly->get_texture()->get_flags()) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP); + +#if CRT_BLOOM + // Bloom curr_effect = downsample_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[1]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[2]); - int bloom_size = (rt->target_width < rt->target_height) ? rt->target_width : rt->target_height; + int bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height(); int bloom_index = 0; - int bloom_width = rt->target_width; - int bloom_height = rt->target_height; + int bloom_width = d3d->get_width(); + int bloom_height = d3d->get_height(); for(; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1) { float source_size[2] = { bloom_width, bloom_height }; @@ -2069,24 +2072,19 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->texture[1] : ct->bloom_texture[bloom_index - 1]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->render_texture[2] : rt->bloom_texture[bloom_index - 1]); - if (ct->bloom_target[bloom_index] == NULL) - { - (*d3dintf->effect.end)(curr_effect); - break; - } - - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, ct->bloom_target[bloom_index]); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 7:%d\n", (int)result, bloom_size); - //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->bloom_target[bloom_index]); + if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); + //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); + //result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2098,13 +2096,23 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) bloom_height >>= 1; } - /* Bloom composite pass*/ + // Bloom composite pass curr_effect = bloom_effect; - float target_size[2] = { rt->target_width, rt->target_height }; + float target_size[2] = { d3d->get_width(), d3d->get_height() }; + (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size); + float weight0123[4] = { options->bloom_level0_weight, options->bloom_level1_weight, + options->bloom_level2_weight, options->bloom_level3_weight }; + float weight4567[4] = { options->bloom_level4_weight, options->bloom_level5_weight, + options->bloom_level6_weight, options->bloom_level7_weight }; + float weight89A[3] = { options->bloom_level8_weight, options->bloom_level9_weight, + options->bloom_level10_weight }; + (*d3dintf->effect.set_vector)(curr_effect, "Level0123Weight", 4, weight0123); + (*d3dintf->effect.set_vector)(curr_effect, "Level4567Weight", 4, weight4567); + (*d3dintf->effect.set_vector)(curr_effect, "Level89AWeight", 3, weight89A); (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size); - (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->texture[1]); + (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->render_texture[2]); (*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f); char name[9] = "Diffuse*"; @@ -2113,7 +2121,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { name[7] = 'A' + index; scale[12] = 'A' + index; - (*d3dintf->effect.set_texture)(curr_effect, name, ct->bloom_texture[index - 1]); + (*d3dintf->effect.set_texture)(curr_effect, name, rt->bloom_texture[index - 1]); (*d3dintf->effect.set_float)(curr_effect, scale, 1.0f); } for(int index = bloom_index; index < 11; index++) @@ -2126,63 +2134,34 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[2]); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 8\n", (int)result); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); - (*d3dintf->effect.end_pass)(curr_effect); - } - - (*d3dintf->effect.end)(curr_effect); - - curr_effect = effect; - - //(*d3dintf->effect.set_float)(curr_effect, "PostPass", 1.0f); - - //blit(backbuffer, ct->last_texture, NULL, poly->type, vertnum, poly->count, d3d->width, d3d->height); - - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 9\n", (int)result); - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]); - - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion); - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); + //HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); + if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); + //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + //result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); #endif - - poly->texture->cur_frame++; - poly->texture->cur_frame %= options->yiq_phase_count; + texture->increment_frame_count(); + texture->mask_frame_count(options->yiq_phase_count); options->params_dirty = false; + } #if HLSL_VECTOR - else if(PRIMFLAG_GET_VECTOR(poly->flags) && vector_enable) + else if(PRIMFLAG_GET_VECTOR(poly->get_flags()) && vector_enable) { - d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); + render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); if (rt == NULL) { return; @@ -2191,50 +2170,49 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) lines_pending = true; curr_effect = vector_effect; - //curr_effect = effect; if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); } - float time_params[2] = { poly->line_time, options->vector_time_scale }; - float length_params[3] = { poly->line_length, options->vector_length_scale, options->vector_length_ratio }; + float time_params[2] = { poly->get_line_time(), options->vector_time_scale }; + float length_params[3] = { poly->get_line_length(), options->vector_length_scale, options->vector_length_ratio }; (*d3dintf->effect.set_vector)(curr_effect, "TimeParams", 2, time_params); (*d3dintf->effect.set_vector)(curr_effect, "LengthParams", 3, length_params); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - curr_effect = effect; + curr_effect = default_effect; (*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f); } - else if (PRIMFLAG_GET_VECTORBUF(poly->flags) && vector_enable) + else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) { //if (!lines_pending) //return; //lines_pending = false; - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0); + render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); if (rt == NULL) { return; @@ -2243,12 +2221,12 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) /* Bloom */ curr_effect = downsample_effect; - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - int bloom_size = (d3d->width < d3d->height) ? d3d->width : d3d->height; + int bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height(); int bloom_index = 0; - int bloom_width = d3d->width; - int bloom_height = d3d->height; + int bloom_width = d3d->get_width(); + int bloom_height = d3d->get_height(); for(; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1) { float source_size[2] = { bloom_width, bloom_height }; @@ -2258,18 +2236,18 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->texture[0] : rt->bloom_texture[bloom_index - 1]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->render_texture[0] : rt->bloom_texture[bloom_index - 1]); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->bloom_target[bloom_index]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->bloom_target[bloom_index]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); - //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2281,13 +2259,13 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) bloom_height >>= 1; } - /* Bloom composite pass*/ + // Bloom composite pass curr_effect = bloom_effect; - float target_size[2] = { d3d->width, d3d->height }; + float target_size[2] = { d3d->get_width(), d3d->get_height() }; (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size); - (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->texture[0]); + (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->render_texture[0]); (*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f); char name[9] = "Diffuse*"; @@ -2309,16 +2287,16 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); - //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); - //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2330,20 +2308,20 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) if(options->params_dirty) { - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor); } - (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->height); + (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "Passthrough", 0.0f); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[1]); - (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->texture[2]); + (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[1]); + (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->render_texture[2]); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[3]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 4\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -2352,69 +2330,38 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2); + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } (*d3dintf->effect.end)(curr_effect); - //curr_effect = effect; - - //blit(backbuffer, rt->bloom_texture[5], NULL, poly->type, vertnum, poly->count); - //blit(rt->target[2], rt->texture[0], NULL, poly->type, vertnum, poly->count); - blit(backbuffer, rt->texture[0], NULL, poly->type, vertnum, poly->count); - //blit(backbuffer, rt->texture[0], NULL, poly->type, vertnum, poly->count); + blit(rt->target[2], rt->render_texture[3], NULL, poly->get_type(), vertnum, poly->get_count()); + blit(backbuffer, rt->render_texture[3], backbuffer, poly->get_type(), vertnum, poly->get_count()); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - /*curr_effect = post_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]); - - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart)); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart)); - - result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); - (*d3dintf->effect.end_pass)(curr_effect); - } - - (*d3dintf->effect.end)(curr_effect);*/ - - vecbuf_type = poly->type; - vecbuf_index = vertnum; - vecbuf_count = poly->count; + lines_pending = false; + } +#else + else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) + { + // Do nothing } #endif else { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height); + curr_effect = default_effect; + + (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width()); + (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height()); (*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f); - (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion); (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); @@ -2422,7 +2369,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) { (*d3dintf->effect.begin_pass)(curr_effect, pass); // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count); + HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); (*d3dintf->effect.end_pass)(curr_effect); } @@ -2434,10 +2381,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum) //============================================================ -// hlsl_info::end_draw +// shaders::end_draw //============================================================ -void hlsl_info::end_draw() +void shaders::end_draw() { if (!master_enable || !d3dintf->post_fx_available) return; @@ -2447,23 +2394,23 @@ void hlsl_info::end_draw() //============================================================ -// hlsl_info::register_prescaled_texture +// shaders::register_prescaled_texture //============================================================ -bool hlsl_info::register_prescaled_texture(d3d_texture_info *texture) +bool shaders::register_prescaled_texture(texture_info *texture) { - return register_texture(texture, texture->rawwidth, texture->rawheight, texture->xprescale, texture->yprescale); + return register_texture(texture); } //============================================================ -// hlsl_info::add_cache_target - register a cache target +// shaders::add_cache_target - register a cache target //============================================================ -bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index) +bool shaders::add_cache_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index) { - d3d_cache_target* target = (d3d_cache_target*)global_alloc_clear(d3d_cache_target); + cache_target* target = (cache_target*)global_alloc_clear(cache_target); - if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale, false)) + if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale)) { global_free(target); return false; @@ -2471,13 +2418,13 @@ bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int widt if (info != NULL) { - target->width = info->texinfo.width; - target->height = info->texinfo.height; + target->width = info->get_texinfo().width; + target->height = info->get_texinfo().height; } else { - target->width = d3d->width; - target->height = d3d->height; + target->width = d3d->get_width(); + target->height = d3d->get_height(); } target->next = cachehead; @@ -2494,7 +2441,7 @@ bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int widt return true; } -d3d_render_target* hlsl_info::get_vector_target() +render_target* shaders::get_vector_target() { #if HLSL_VECTOR if (!vector_enable) @@ -2502,18 +2449,19 @@ d3d_render_target* hlsl_info::get_vector_target() return false; } - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; - return find_render_target(d3d->width, d3d->height, 0, 0); -#endif + return find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); +#else return NULL; +#endif } -void hlsl_info::create_vector_target(render_primitive *prim) +void shaders::create_vector_target(render_primitive *prim) { #if HLSL_VECTOR - d3d_info *d3d = (d3d_info *)window->drawdata; - if (!add_render_target(d3d, NULL, d3d->width, d3d->height, 1, 1, true)) + renderer *d3d = (renderer *)window->drawdata; + if (!add_render_target(d3d, NULL, d3d->get_width(), d3d->get_height(), 1, 1)) { vector_enable = false; } @@ -2521,37 +2469,37 @@ void hlsl_info::create_vector_target(render_primitive *prim) } //============================================================ -// hlsl_info::add_render_target - register a render target +// shaders::add_render_target - register a render target //============================================================ -bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom) +bool shaders::add_render_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale) { UINT32 screen_index = 0; UINT32 page_index = 0; if (info != NULL) { - d3d_render_target *existing_target = find_render_target(info); + render_target *existing_target = find_render_target(info); if (existing_target != NULL) { remove_render_target(existing_target); } - UINT32 screen_index_data = (UINT32)info->texinfo.osddata; + UINT32 screen_index_data = (UINT32)info->get_texinfo().osddata; screen_index = screen_index_data >> 1; page_index = screen_index_data & 1; } else { - d3d_render_target *existing_target = find_render_target(d3d->width, d3d->height, 0, 0); + render_target *existing_target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); if (existing_target != NULL) { remove_render_target(existing_target); } } - d3d_render_target* target = (d3d_render_target*)global_alloc_clear(d3d_render_target); + render_target* target = (render_target*)global_alloc_clear(render_target); - if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale, bloom)) + if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale)) { global_free(target); return false; @@ -2559,26 +2507,26 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid if (info != NULL) { - target->width = info->texinfo.width; - target->height = info->texinfo.height; + target->width = info->get_texinfo().width; + target->height = info->get_texinfo().height; } else { - target->width = d3d->width; - target->height = d3d->height; + target->width = d3d->get_width(); + target->height = d3d->get_height(); } - HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, target->target[0]); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, target->target[0]); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); + result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); - result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); target->screen_index = screen_index; target->page_index = page_index; - d3d_cache_target* cache = find_cache_target(target->screen_index, target->width, target->height); + cache_target* cache = find_cache_target(target->screen_index, target->width, target->height); if (cache == NULL) { if (!add_cache_target(d3d, info, width, height, xprescale, yprescale, target->screen_index)) @@ -2601,9 +2549,9 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid } //============================================================ -// hlsl_info::enumerate_screens +// shaders::enumerate_screens //============================================================ -void hlsl_info::enumerate_screens() +void shaders::enumerate_screens() { screen_device_iterator iter(window->machine().root_device()); num_screens = iter.count(); @@ -2611,27 +2559,24 @@ void hlsl_info::enumerate_screens() //============================================================ -// hlsl_info::register_texture +// shaders::register_texture(texture::info) //============================================================ -bool hlsl_info::register_texture(d3d_texture_info *texture) +bool shaders::register_texture(texture_info *texture) { - return register_texture(texture, texture->rawwidth, texture->rawheight, 1, 1); -} - - -//============================================================ -// hlsl_info::register_texture(d3d_texture_info, int, int, int, int) -//============================================================ + int width = texture->get_width(); + int height = texture->get_height(); + int xscale = texture->get_xscale(); + int yscale = texture->get_yscale(); -bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int height, int xscale, int yscale) -{ if (!master_enable || !d3dintf->post_fx_available) - return 0; + { + return false; + } enumerate_screens(); - d3d_info *d3d = (d3d_info *)window->drawdata; + renderer *d3d = (renderer *)window->drawdata; int hlsl_prescale_x = prescale_force_x; int hlsl_prescale_y = prescale_force_y; @@ -2640,7 +2585,7 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh if (hlsl_prescale_x == 0) { hlsl_prescale_x = 1; - while (width * xscale * hlsl_prescale_x <= d3d->width) + while (width * xscale * hlsl_prescale_x <= d3d->get_width()) { hlsl_prescale_x++; } @@ -2650,7 +2595,7 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh if (hlsl_prescale_y == 0) { hlsl_prescale_y = 1; - while (height * yscale * hlsl_prescale_y <= d3d->height) + while (height * yscale * hlsl_prescale_y <= d3d->get_height()) { hlsl_prescale_y++; } @@ -2669,10 +2614,10 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh } //============================================================ -// hlsl_info::delete_resources +// shaders::delete_resources //============================================================ -void hlsl_info::delete_resources(bool reset) +void shaders::delete_resources(bool reset) { if (!master_enable || !d3dintf->post_fx_available) return; @@ -2682,7 +2627,7 @@ void hlsl_info::delete_resources(bool reset) if(write_ini && !reset) { emu_file file(downcast<windows_options &>(window->machine().options()).screen_post_fx_dir(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - file_error filerr = open_next((d3d_info*)window->drawdata, file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); + file_error filerr = open_next((renderer*)window->drawdata, file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); if (filerr != FILERR_NONE) return; @@ -2744,7 +2689,7 @@ void hlsl_info::delete_resources(bool reset) remove_render_target(targethead); } -#if HLSL_VECTOR +#if (HLSL_VECTOR || CRT_BLOOM) if (downsample_effect != NULL) { (*d3dintf->effect.release)(downsample_effect); @@ -2756,10 +2701,10 @@ void hlsl_info::delete_resources(bool reset) bloom_effect = NULL; } #endif - if (effect != NULL) + if (default_effect != NULL) { - (*d3dintf->effect.release)(effect); - effect = NULL; + (*d3dintf->effect.release)(default_effect); + default_effect = NULL; } if (post_effect != NULL) { @@ -3237,7 +3182,7 @@ static INT32 slider_saturation(running_machine &machine, void *arg, astring *str // init_slider_list //============================================================ -slider_state *hlsl_info::init_slider_list() +slider_state *shaders::init_slider_list() { if (!master_enable || !d3dintf->post_fx_available) { @@ -3307,6 +3252,8 @@ slider_state *hlsl_info::init_slider_list() return listhead; } +}; + //============================================================ // get_slider_list //============================================================ @@ -3325,12 +3272,12 @@ void *windows_osd_interface::get_slider_list() // scheme //------------------------------------------------- -static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, const char *extension, int idx) +static file_error open_next(d3d::renderer *d3d, emu_file &file, const char *templ, const char *extension, int idx) { UINT32 origflags = file.openflags(); // handle defaults - const char *snapname = templ ? templ : d3d->window->machine().options().snap_name(); + const char *snapname = templ ? templ : d3d->get_window()->machine().options().snap_name(); if (snapname == NULL || snapname[0] == 0) snapname = "%g/%i"; @@ -3377,7 +3324,7 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co snapdevname.cpysubstr(snapstr, pos + 3, end - pos - 3); // verify that there is such a device for this system - image_interface_iterator iter(d3d->window->machine().root_device()); + image_interface_iterator iter(d3d->get_window()->machine().root_device()); for (device_image_interface *image = iter.first(); image != NULL; iter.next()) { // get the device name @@ -3414,7 +3361,7 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co // substitute path and gamename up front snapstr.replace(0, "/", PATH_SEPARATOR); - snapstr.replace(0, "%g", d3d->window->machine().basename()); + snapstr.replace(0, "%g", d3d->get_window()->machine().basename()); // determine if the template has an index; if not, we always use the same name astring fname; @@ -3443,3 +3390,4 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co file.set_openflags(origflags); return file.open(fname); } + |