diff options
author | 2013-06-06 01:57:42 +0000 | |
---|---|---|
committer | 2013-06-06 01:57:42 +0000 | |
commit | cbf1480545096f2136c6850f2c428b43e69d7c3c (patch) | |
tree | d6a078d9fefed22e6f6a4175e5a58fe286eb69f9 /src/osd/windows/d3dhlsl.c | |
parent | e733ce852150245d0a7aa98f87bfd958083052e1 (diff) |
As this project is clearly now run by people who care more about "feelings" and playing patty-cake with one another rather than actual results, consider this my resignation letter.
Anyone who wants to know where HLSL went, feel free to ask Tafoid why he couldn't take a simple joke.
Diffstat (limited to 'src/osd/windows/d3dhlsl.c')
-rw-r--r-- | src/osd/windows/d3dhlsl.c | 3544 |
1 files changed, 0 insertions, 3544 deletions
diff --git a/src/osd/windows/d3dhlsl.c b/src/osd/windows/d3dhlsl.c deleted file mode 100644 index 90d60bff071..00000000000 --- a/src/osd/windows/d3dhlsl.c +++ /dev/null @@ -1,3544 +0,0 @@ -//============================================================ -// -// d3dhlsl.c - Win32 Direct3D HLSL implementation -// -//============================================================ -// -// Copyright Aaron Giles -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or -// without modification, are permitted provided that the -// following conditions are met: -// -// * Redistributions of source code must retain the above -// copyright notice, this list of conditions and the -// following disclaimer. -// * Redistributions in binary form must reproduce the -// above copyright notice, this list of conditions and -// the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// * Neither the name 'MAME' nor the names of its -// contributors may be used to endorse or promote -// products derived from this software without specific -// prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -//============================================================ - -// Useful info: -// Windows XP/2003 shipped with DirectX 8.1 -// Windows 2000 shipped with DirectX 7a -// Windows 98SE shipped with DirectX 6.1a -// Windows 98 shipped with DirectX 5 -// Windows NT shipped with DirectX 3.0a -// Windows 95 shipped with DirectX 2 - -// standard windows headers -#define WIN32_LEAN_AND_MEAN -#include <windows.h> -#include <tchar.h> -#include <mmsystem.h> -#include <d3d9.h> -#include <d3dx9.h> -#include <math.h> -#undef interface - -// MAME headers -#include "emu.h" -#include "render.h" -#include "ui.h" -#include "rendutil.h" -#include "options.h" -#include "emuopts.h" -#include "aviio.h" -#include "png.h" -#include "screen.h" - -// MAMEOS headers -#include "d3dintf.h" -#include "winmain.h" -#include "window.h" -#include "config.h" -#include "strconv.h" -#include "d3dcomm.h" -#include "drawd3d.h" - - - -//============================================================ -// GLOBALS -//============================================================ - -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, - 0.25f, { "aperture.png" }, 320, 240, 0.09375f, 0.109375f, - 0.03f, 0.03f, - 0.5f, 1.0f, 0.5f, 1.0f, 0.0f, 0.0f, - { 0.0f, 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f }, - { 0.9f, 0.9f, 0.9f }, - { 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, - 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, - 0.25f, { "aperture.png" }, 320, 240, 0.09375f, 0.109375f, - 0.03f, 0.03f, - 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 0.0f, - { 0.0f, 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f }, - { 0.9f, 0.9f, 0.9f }, - { 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, - 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, - 0.25f, { "aperture.png" }, 320, 240, 0.09375f, 0.109375f, - 0.0f, 0.0f, - 0.0f, 1.0f, 0.5f, 1.0f, 0.0f, 0.0f, - { 0.0f, 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f }, - { 0.9f, 0.9f, 0.9f }, - { 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, - 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, - 0.25f, { "aperture.png" }, 320, 240, 0.09375f, 0.109375f, - 0.15f, 0.15f, - 1.0f, 1.0f, 0.5f, 1.0f, 0.0f, 0.5f, - { 3.0f, 3.0f, 3.0f, 3.0f }, - { 0.5f,-0.33f,0.7f }, - { 0.0f,-1.0f, 0.5f }, - { 0.0f, 0.2f, 0.3f }, - { 0.0f, 0.2f, 0.0f }, - { 0.8f, 0.2f, 0.0f }, - { 0.0f, 0.8f, 0.2f}, - { 0.2f, 0.0f, 0.8f}, - { 0.0f, 0.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f }, - { 1.5f, 1.5f, 1.5f }, - { 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, - 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 - }, -}; - -//============================================================ -// PROTOTYPES -//============================================================ - -static void get_vector(const char *data, int count, float *out, int report_error); - - - -//============================================================ -// shader manager constructor -//============================================================ - -shaders::shaders() -{ - master_enable = false; - vector_enable = true; - prescale_size_x = 1; - prescale_size_y = 1; - prescale_force_x = 0; - prescale_force_y = 0; - preset = -1; - shadow_texture = NULL; - options = NULL; - paused = true; - lastidx = -1; - targethead = NULL; - cachehead = NULL; - initialized = false; -} - - - -//============================================================ -// shaders destructor -//============================================================ - -shaders::~shaders() -{ - global_free(options); - cache_target *currcache = cachehead; - while(cachehead != NULL) - { - cachehead = currcache->next; - global_free(currcache); - currcache = cachehead; - } - - render_target *currtarget = targethead; - while(targethead != NULL) - { - targethead = currtarget->next; - global_free(currtarget); - currtarget = targethead; - } -} - - - -//============================================================ -// shaders::window_save -//============================================================ - -void shaders::window_save() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - 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); - return; - } - (*d3dintf->texture.get_surface_level)(snap_copy_texture, 0, &snap_copy_target); - - 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); - return; - } - (*d3dintf->texture.get_surface_level)(snap_texture, 0, &snap_target); - - render_snap = true; - snap_rendered = false; -} - - - -//============================================================ -// shaders::window_record -//============================================================ - -void shaders::window_record() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - windows_options &options = downcast<windows_options &>(window->machine().options()); - const char *filename = options.d3d_hlsl_write(); - - if (avi_output_file != NULL) - end_avi_recording(); - else if (filename[0] != 0) - begin_avi_recording(filename); -} - - -//============================================================ -// shaders::avi_update_snap -//============================================================ - -void shaders::avi_update_snap(surface *surface) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - D3DLOCKED_RECT rect; - - // if we don't have a bitmap, or if it's not the right size, allocate a new one - if (!avi_snap.valid() || (int)snap_width != avi_snap.width() || (int)snap_height != avi_snap.height()) - { - avi_snap.allocate((int)snap_width, (int)snap_height); - } - - // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, avi_copy_surface); - if (result != D3D_OK) - { - return; - } - - // lock the texture - result = (*d3dintf->surface.lock_rect)(avi_copy_surface, &rect, NULL, D3DLOCK_DISCARD); - if (result != D3D_OK) - { - return; - } - - // loop over Y - for (int srcy = 0; srcy < (int)snap_height; srcy++) - { - DWORD *src = (DWORD *)((BYTE *)rect.pBits + srcy * rect.Pitch); - UINT32 *dst = &avi_snap.pix32(srcy); - - for(int x = 0; x < snap_width; x++) - *dst++ = *src++; - } - - // unlock - result = (*d3dintf->surface.unlock_rect)(avi_copy_surface); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); -} - - - -//============================================================ -// hlsl_render_snapshot -//============================================================ - -void shaders::render_snapshot(surface *surface) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - D3DLOCKED_RECT rect; - - render_snap = false; - - // if we don't have a bitmap, or if it's not the right size, allocate a new one - if (!avi_snap.valid() || snap_width != (avi_snap.width() / 2) || snap_height != (avi_snap.height() / 2)) - { - avi_snap.allocate(snap_width / 2, snap_height / 2); - } - - // copy the texture - HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, snap_copy_target); - if (result != D3D_OK) - { - return; - } - - // lock the texture - result = (*d3dintf->surface.lock_rect)(snap_copy_target, &rect, NULL, D3DLOCK_DISCARD); - if (result != D3D_OK) - { - return; - } - - for(int cy = 0; cy < 2; cy++) - { - for(int cx = 0; cx < 2; cx++) - { - // loop over Y - for (int srcy = 0; srcy < snap_height / 2; srcy++) - { - int toty = (srcy + cy * (snap_height / 2)); - int totx = cx * (snap_width / 2); - DWORD *src = (DWORD *)((BYTE *)rect.pBits + toty * rect.Pitch + totx * 4); - UINT32 *dst = &avi_snap.pix32(srcy); - - for(int x = 0; x < snap_width / 2; x++) - *dst++ = *src++; - } - - int idx = cy * 2 + cx; - - emu_file file(window->machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - file_error filerr = open_next(d3d, file, NULL, "png", idx); - if (filerr != FILERR_NONE) - return; - - // add two text entries describing the image - astring text1(emulator_info::get_appname(), " ", build_version); - astring text2(window->machine().system().manufacturer, " ", window->machine().system().description); - png_info pnginfo = { 0 }; - png_add_text(&pnginfo, "Software", text1); - png_add_text(&pnginfo, "System", text2); - - // now do the actual work - png_error error = png_write_bitmap(file, &pnginfo, avi_snap, 1 << 24, NULL); - if (error != PNGERR_NONE) - mame_printf_error("Error generating PNG for HLSL snapshot: png_error = %d\n", error); - - // free any data allocated - png_free(&pnginfo); - } - } - - // unlock - result = (*d3dintf->surface.unlock_rect)(snap_copy_target); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result); - - if(snap_texture != NULL) - { - (*d3dintf->texture.release)(snap_texture); - snap_texture = NULL; - } - - if(snap_target != NULL) - { - (*d3dintf->surface.release)(snap_target); - snap_target = NULL; - } - - if(snap_copy_texture != NULL) - { - (*d3dintf->texture.release)(snap_copy_texture); - snap_copy_texture = NULL; - } - - if(snap_copy_target != NULL) - { - (*d3dintf->surface.release)(snap_copy_target); - snap_copy_target = NULL; - } -} - - -//============================================================ -// shaders::record_texture -//============================================================ - -void shaders::record_texture() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - surface *surface = avi_final_target; - - // ignore if nothing to do - if (avi_output_file == NULL || surface == NULL) - return; - - // get the current time - attotime curtime = window->machine().time(); - - avi_update_snap(surface); - - // loop until we hit the right time - while (avi_next_frame_time <= curtime) - { - // handle an AVI recording - // write the next frame - avi_error avierr = avi_append_video_frame(avi_output_file, avi_snap); - if (avierr != AVIERR_NONE) - { - end_avi_recording(); - return; - } - - // advance time - avi_next_frame_time += avi_frame_period; - avi_frame++; - } -} - - -//============================================================ -// shaders::end_hlsl_avi_recording -//============================================================ - -void shaders::end_avi_recording() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - if (avi_output_file != NULL) - avi_close(avi_output_file); - - avi_output_file = NULL; - avi_frame = 0; -} - - -//============================================================ -// shaders::set_texture -//============================================================ - -void shaders::toggle() -{ - if (master_enable) - { - if (initialized) - { - delete_resources(false); - } - master_enable = !master_enable; - } - else - { - if (!initialized) - { - master_enable = !master_enable; - bool failed = create_resources(false); - if (failed) - { - master_enable = false; - } - } - else - { - master_enable = !master_enable; - } - } -} - -//============================================================ -// shaders::begin_avi_recording -//============================================================ - -void shaders::begin_avi_recording(const char *name) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - // stop any existing recording - end_avi_recording(); - - // reset the state - avi_frame = 0; - avi_next_frame_time = window->machine().time(); - - // build up information about this new movie - avi_movie_info info; - info.video_format = 0; - info.video_timescale = 1000 * ((window->machine().primary_screen != NULL) ? ATTOSECONDS_TO_HZ(window->machine().primary_screen->frame_period().attoseconds) : screen_device::DEFAULT_FRAME_RATE); - info.video_sampletime = 1000; - info.video_numsamples = 0; - info.video_width = snap_width; - info.video_height = snap_height; - info.video_depth = 24; - - info.audio_format = 0; - info.audio_timescale = window->machine().sample_rate(); - info.audio_sampletime = 1; - info.audio_numsamples = 0; - info.audio_channels = 2; - info.audio_samplebits = 16; - info.audio_samplerate = window->machine().sample_rate(); - - // create a new temporary movie file - file_error filerr; - astring fullpath; - { - emu_file tempfile(window->machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS); - if (name != NULL) - { - filerr = tempfile.open(name); - } - else - { - filerr = open_next(d3d, tempfile, NULL, "avi", 0); - } - - // compute the frame time - { - avi_frame_period = attotime::from_seconds(1000) / info.video_timescale; - } - - // if we succeeded, make a copy of the name and create the real file over top - if (filerr == FILERR_NONE) - { - fullpath = tempfile.fullpath(); - } - } - - if (filerr == FILERR_NONE) - { - // create the file and free the string - avi_error avierr = avi_create(fullpath, &info, &avi_output_file); - if (avierr != AVIERR_NONE) - { - mame_printf_error("Error creating AVI: %s\n", avi_error_string(avierr)); - } - } -} - - -//============================================================ -// remove_cache_target - remove an active cache target when -// refcount hits zero -//============================================================ - -void shaders::remove_cache_target(cache_target *cache) -{ - if (cache != NULL) - { - if (cache == cachehead) - { - cachehead = cachehead->next; - } - - if (cache->prev != NULL) - { - cache->prev->next = cache->next; - } - - if (cache->next != NULL) - { - cache->next->prev = cache->prev; - } - - global_free(cache); - } -} - - -//============================================================ -// remove_render_target - remove an active target -//============================================================ - -void shaders::remove_render_target(texture_info *texture) -{ - remove_render_target(find_render_target(texture)); -} - -void shaders::remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) -{ - render_target *target = find_render_target(width, height, screen_index, page_index); - if (target != NULL) - { - remove_render_target(target); - } -} - -void shaders::remove_render_target(render_target *rt) -{ - if (rt != NULL) - { - if (rt == targethead) - { - targethead = targethead->next; - } - - if (rt->prev != NULL) - { - rt->prev->next = rt->next; - } - - if (rt->next != NULL) - { - rt->next->prev = rt->prev; - } - - cache_target *cache = find_cache_target(rt->screen_index, rt->width, rt->height); - if (cache != NULL) - { - remove_cache_target(cache); - } - - int screen_index = rt->screen_index; - int other_page = 1 - rt->page_index; - int width = rt->width; - int height = rt->height; - - global_free(rt); - - // Remove other double-buffered page (if it exists) - remove_render_target(width, height, screen_index, other_page); - } -} - - -//============================================================ -// shaders::set_texture -//============================================================ - -void shaders::set_texture(texture_info *texture) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - if(texture != NULL) - { - paused = texture->paused(); - texture->advance_frame(); - } - - 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) ? default_texture->get_finaltex() : texture->get_finaltex()); - else - (*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()); -} - - -//============================================================ -// shaders::init -//============================================================ - -void shaders::init(base *d3dintf, win_window_info *window) -{ - if (!d3dintf->post_fx_available) - return; - - this->d3dintf = d3dintf; - this->window = window; - - master_enable = downcast<windows_options &>(window->machine().options()).d3d_hlsl_enable(); - prescale_size_x = 1; - prescale_size_y = 1; - preset = downcast<windows_options &>(window->machine().options()).d3d_hlsl_preset(); - if (preset < -1 || preset > 3) - { - preset = -1; - } - - snap_width = downcast<windows_options &>(window->machine().options()).d3d_snap_width(); - snap_height = downcast<windows_options &>(window->machine().options()).d3d_snap_height(); - prescale_force_x = 0; - prescale_force_y = 0; - - windows_options &winoptions = downcast<windows_options &>(window->machine().options()); - - options = (hlsl_options*)global_alloc_clear(hlsl_options); - - options->params_dirty = true; - strcpy(options->shadow_mask_texture, downcast<windows_options &>(window->machine().options()).screen_shadow_mask_texture()); // unsafe - - write_ini = downcast<windows_options &>(window->machine().options()).hlsl_write_ini(); - read_ini = downcast<windows_options &>(window->machine().options()).hlsl_read_ini(); - - 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((renderer*)window->drawdata, ini_file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); - - read_ini = false; - if (filerr == FILERR_NONE) - { - ini_file.seek(0, SEEK_END); - if (ini_file.tell() >= 1000) - { - read_ini = true; - ini_file.seek(0, SEEK_SET); - - int en = 0; - char buf[1024]; - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_enable %d\n", &en); - master_enable = en == 1; - - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_prescale_x %d\n", &prescale_force_x); - - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_prescale_y %d\n", &prescale_force_y); - - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_preset %d\n", &preset); - - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_snap_width %d\n", &snap_width); - - ini_file.gets(buf, 1024); - sscanf(buf, "hlsl_snap_height %d\n", &snap_height); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_alpha %f\n", &options->shadow_mask_alpha); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_texture %s\n", options->shadow_mask_texture); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_x_count %d\n", &options->shadow_mask_count_x); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_y_count %d\n", &options->shadow_mask_count_y); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_usize %f\n", &options->shadow_mask_u_size); - - ini_file.gets(buf, 1024); - sscanf(buf, "shadow_mask_vsize %f\n", &options->shadow_mask_v_size); - - ini_file.gets(buf, 1024); - sscanf(buf, "curvature %f\n", &options->curvature); - - ini_file.gets(buf, 1024); - sscanf(buf, "pincushion %f\n", &options->pincushion); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_alpha %f\n", &options->scanline_alpha); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_size %f\n", &options->scanline_scale); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_height %f\n", &options->scanline_height); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_bright_scale %f\n", &options->scanline_bright_scale); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_bright_offset %f\n", &options->scanline_bright_offset); - - ini_file.gets(buf, 1024); - sscanf(buf, "scanline_jitter %f\n", &options->scanline_offset); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "defocus %f %f\n", &options->defocus[0], &options->defocus[1]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "converge_x %f %f %f\n", &options->converge_x[0], &options->converge_x[1], &options->converge_x[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "converge_y %f %f %f\n", &options->converge_y[0], &options->converge_y[1], &options->converge_y[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "radial_converge_x %f %f %f\n", &options->radial_converge_x[0], &options->radial_converge_x[1], &options->radial_converge_x[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "radial_converge_y %f %f %f\n", &options->radial_converge_y[0], &options->radial_converge_y[1], &options->radial_converge_y[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "red_ratio %f %f %f\n", &options->red_ratio[0], &options->red_ratio[1], &options->red_ratio[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "grn_ratio %f %f %f\n", &options->grn_ratio[0], &options->grn_ratio[1], &options->grn_ratio[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "blu_ratio %f %f %f\n", &options->blu_ratio[0], &options->blu_ratio[1], &options->blu_ratio[2]); - - ini_file.gets(buf, 1024); - sscanf(buf, "saturation %f\n", &options->saturation); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "offset %f %f %f\n", &options->offset[0], &options->offset[1], &options->offset[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "scale %f %f %f\n", &options->scale[0], &options->scale[1], &options->scale[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "power %f %f %f\n", &options->power[0], &options->power[1], &options->power[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "floor %f %f %f\n", &options->floor[0], &options->floor[1], &options->floor[2]); - - ini_file.gets(buf, 1024); - for(int idx = 0; idx < strlen(buf); idx++) if(buf[idx] == ',') buf[idx] = ' '; - sscanf(buf, "phosphor_life %f %f %f\n", &options->phosphor[0], &options->phosphor[1], &options->phosphor[2]); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_enable %d\n", &en); - options->yiq_enable = en == 1; - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_cc %f\n", &options->yiq_cc); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_a %f\n", &options->yiq_a); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_b %f\n", &options->yiq_b); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_o %f\n", &options->yiq_o); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_p %f\n", &options->yiq_p); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_n %f\n", &options->yiq_n); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_y %f\n", &options->yiq_y); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_i %f\n", &options->yiq_i); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_q %f\n", &options->yiq_q); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_scan_time %f\n", &options->yiq_scan_time); - - ini_file.gets(buf, 1024); - sscanf(buf, "yiq_phase_count %d\n", &options->yiq_phase_count); - - ini_file.gets(buf, 1024); - sscanf(buf, "vector_length_scale %f\n", &options->vector_length_scale); - - ini_file.gets(buf, 1024); - sscanf(buf, "vector_length_ratio %f\n", &options->vector_length_ratio); - } - } - } - else - { - prescale_force_x = winoptions.d3d_hlsl_prescale_x(); - prescale_force_y = winoptions.d3d_hlsl_prescale_y(); - if(preset == -1) - { - options->shadow_mask_alpha = winoptions.screen_shadow_mask_alpha(); - options->shadow_mask_count_x = winoptions.screen_shadow_mask_count_x(); - options->shadow_mask_count_y = winoptions.screen_shadow_mask_count_y(); - options->shadow_mask_u_size = winoptions.screen_shadow_mask_u_size(); - options->shadow_mask_v_size = winoptions.screen_shadow_mask_v_size(); - options->curvature = winoptions.screen_curvature(); - options->pincushion = winoptions.screen_pincushion(); - options->scanline_alpha = winoptions.screen_scanline_amount(); - options->scanline_scale = winoptions.screen_scanline_scale(); - options->scanline_height = winoptions.screen_scanline_height(); - options->scanline_bright_scale = winoptions.screen_scanline_bright_scale(); - options->scanline_bright_offset = winoptions.screen_scanline_bright_offset(); - options->scanline_offset = winoptions.screen_scanline_offset(); - get_vector(winoptions.screen_defocus(), 2, options->defocus, TRUE); - get_vector(winoptions.screen_converge_x(), 3, options->converge_x, TRUE); - get_vector(winoptions.screen_converge_y(), 3, options->converge_y, TRUE); - get_vector(winoptions.screen_radial_converge_x(), 3, options->radial_converge_x, TRUE); - get_vector(winoptions.screen_radial_converge_y(), 3, options->radial_converge_y, TRUE); - get_vector(winoptions.screen_red_ratio(), 3, options->red_ratio, TRUE); - get_vector(winoptions.screen_grn_ratio(), 3, options->grn_ratio, TRUE); - get_vector(winoptions.screen_blu_ratio(), 3, options->blu_ratio, TRUE); - get_vector(winoptions.screen_offset(), 3, options->offset, TRUE); - get_vector(winoptions.screen_scale(), 3, options->scale, TRUE); - get_vector(winoptions.screen_power(), 3, options->power, TRUE); - get_vector(winoptions.screen_floor(), 3, options->floor, TRUE); - get_vector(winoptions.screen_phosphor(), 3, options->phosphor, TRUE); - options->saturation = winoptions.screen_saturation(); - } - else - { - options = &s_hlsl_presets[preset]; - } - - options->yiq_enable = winoptions.screen_yiq_enable(); - options->yiq_cc = winoptions.screen_yiq_cc(); - options->yiq_a = winoptions.screen_yiq_a(); - options->yiq_b = winoptions.screen_yiq_b(); - options->yiq_o = winoptions.screen_yiq_o(); - options->yiq_p = winoptions.screen_yiq_p(); - options->yiq_n = winoptions.screen_yiq_n(); - options->yiq_y = winoptions.screen_yiq_y(); - options->yiq_i = winoptions.screen_yiq_i(); - options->yiq_q = winoptions.screen_yiq_q(); - options->yiq_scan_time = winoptions.screen_yiq_scan_time(); - options->yiq_phase_count = winoptions.screen_yiq_phase_count(); - options->vector_length_scale = winoptions.screen_vector_length_scale(); - options->vector_length_ratio = winoptions.screen_vector_length_ratio(); - options->vector_bloom_scale = winoptions.screen_vector_bloom_scale(); - options->raster_bloom_scale = winoptions.screen_raster_bloom_scale(); - 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; - // experimental: load a PNG to use for vector rendering; it is treated - // as a brightness map - emu_file file(window->machine().options().art_path(), OPEN_FLAG_READ); - - render_load_png(shadow_bitmap, file, NULL, options->shadow_mask_texture); - - g_slider_list = init_slider_list(); -} - - - -//============================================================ -// shaders::init_fsfx_quad -//============================================================ - -void shaders::init_fsfx_quad(void *vertbuf) -{ - // Called at the start of each frame by the D3D code in order to reserve two triangles - // that are guaranteed to be at a fixed position so as to simply use D3DPT_TRIANGLELIST, 0, 2 - // instead of having to do bookkeeping about a specific screen quad - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - // get a pointer to the vertex buffer - 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->get_width(); - fsfx_vertices[1].y = 0.0f; - fsfx_vertices[2].x = 0.0f; - 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->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; - - fsfx_vertices[1].u0 = 1.0f; - fsfx_vertices[1].v0 = 0.0f; - - fsfx_vertices[2].u0 = 0.0f; - fsfx_vertices[2].v0 = 1.0f; - - fsfx_vertices[3].u0 = 1.0f; - fsfx_vertices[3].v0 = 0.0f; - - fsfx_vertices[4].u0 = 0.0f; - fsfx_vertices[4].v0 = 1.0f; - - fsfx_vertices[5].u0 = 1.0f; - fsfx_vertices[5].v0 = 1.0f; - - fsfx_vertices[0].u1 = 0.0f; - fsfx_vertices[0].v1 = 0.0f; - fsfx_vertices[1].u1 = 0.0f; - fsfx_vertices[1].v1 = 0.0f; - fsfx_vertices[2].u1 = 0.0f; - fsfx_vertices[2].v1 = 0.0f; - fsfx_vertices[3].u1 = 0.0f; - fsfx_vertices[3].v1 = 0.0f; - fsfx_vertices[4].u1 = 0.0f; - fsfx_vertices[4].v1 = 0.0f; - fsfx_vertices[5].u1 = 0.0f; - fsfx_vertices[5].v1 = 0.0f; - - // set the color, Z parameters to standard values - for (int i = 0; i < 6; i++) - { - fsfx_vertices[i].z = 0.0f; - fsfx_vertices[i].rhw = 1.0f; - fsfx_vertices[i].color = D3DCOLOR_ARGB(255, 255, 255, 255); - } -} - - - -//============================================================ -// shaders::create_resources -//============================================================ - -int shaders::create_resources(bool reset) -{ - if (!master_enable || !d3dintf->post_fx_available) - return 0; - - renderer *d3d = (renderer *)window->drawdata; - - 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->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->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->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->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->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); - return 1; - } - (*d3dintf->texture.get_surface_level)(avi_copy_texture, 0, &avi_copy_surface); - - 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); - return 1; - } - (*d3dintf->texture.get_surface_level)(avi_final_texture, 0, &avi_final_target); - - // experimental: if we have a shadow bitmap, create a texture for it - if (shadow_bitmap.valid()) - { - render_texinfo texture; - - // fake in the basic data so it looks like it came from render.c - texture.base = shadow_bitmap.raw_pixptr(0); - texture.rowpixels = shadow_bitmap.rowpixels(); - texture.width = shadow_bitmap.width(); - texture.height = shadow_bitmap.height(); - texture.palette = NULL; - texture.seqid = 0; - - // now create it - 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(); - - // Replace all this garbage with a proper data-driven system - char primary_name_cstr[1024]; - sprintf(primary_name_cstr, "%s\\primary.fx", fx_dir); - TCHAR *primary_name = tstring_from_utf8(primary_name_cstr); - - char post_name_cstr[1024]; - sprintf(post_name_cstr, "%s\\post.fx", fx_dir); - TCHAR *post_name = tstring_from_utf8(post_name_cstr); - - char prescale_name_cstr[1024]; - sprintf(prescale_name_cstr, "%s\\prescale.fx", fx_dir); - TCHAR *prescale_name = tstring_from_utf8(prescale_name_cstr); - - char pincushion_name_cstr[1024]; - sprintf(pincushion_name_cstr, "%s\\pincushion.fx", fx_dir); - TCHAR *pincushion_name = tstring_from_utf8(pincushion_name_cstr); - - char phosphor_name_cstr[1024]; - sprintf(phosphor_name_cstr, "%s\\phosphor.fx", fx_dir); - TCHAR *phosphor_name = tstring_from_utf8(phosphor_name_cstr); - - char focus_name_cstr[1024]; - sprintf(focus_name_cstr, "%s\\focus.fx", fx_dir); - TCHAR *focus_name = tstring_from_utf8(focus_name_cstr); - - char deconverge_name_cstr[1024]; - sprintf(deconverge_name_cstr, "%s\\deconverge.fx", fx_dir); - TCHAR *deconverge_name = tstring_from_utf8(deconverge_name_cstr); - - char color_name_cstr[1024]; - sprintf(color_name_cstr, "%s\\color.fx", fx_dir); - TCHAR *color_name = tstring_from_utf8(color_name_cstr); - - char yiq_encode_name_cstr[1024]; - sprintf(yiq_encode_name_cstr, "%s\\yiq_encode.fx", fx_dir); - TCHAR *yiq_encode_name = tstring_from_utf8(yiq_encode_name_cstr); - - char yiq_decode_name_cstr[1024]; - sprintf(yiq_decode_name_cstr, "%s\\yiq_decode.fx", fx_dir); - TCHAR *yiq_decode_name = tstring_from_utf8(yiq_decode_name_cstr); - - // create the regular shader - 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"); - return 1; - } - - // create the post-processing shader - 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"); - return 1; - } - - // create the prescaling shader - 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"); - return 1; - } - - // create the pincushion shader - 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"); - return 1; - } - - // create the phosphor shader - 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"); - return 1; - } - - // create the focus shader - 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"); - return 1; - } - - // create the deconvergence shader - 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"); - return 1; - } - - // create the color convolution shader - 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"); - return 1; - } - - // create the YIQ modulation shader - 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"); - return 1; - } - - // create the YIQ demodulation shader - 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; - } - -#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->get_device(), bloom_name, &bloom_effect); - if(result != D3D_OK) - { - mame_printf_verbose("Direct3D: Unable to load bloom.fx\n"); - return 1; - } - if (bloom_name) - osd_free(bloom_name); - - char downsample_cstr[1024]; - sprintf(downsample_cstr, "%s\\downsample.fx", fx_dir); - TCHAR *downsample_name = tstring_from_utf8(downsample_cstr); - - 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"); - return 1; - } - 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->get_device(), vector_name, &vector_effect); - if(result != D3D_OK) - { - mame_printf_verbose("Direct3D: Unable to load vector.fx\n"); - return 1; - } - if (vector_name) - osd_free(vector_name); -#endif - - if (primary_name) - osd_free(primary_name); - if (post_name) - osd_free(post_name); - if (prescale_name) - osd_free(prescale_name); - if (pincushion_name) - osd_free(pincushion_name); - if (phosphor_name) - osd_free(phosphor_name); - if (focus_name) - osd_free(focus_name); - if (deconverge_name) - osd_free(deconverge_name); - if (color_name) - osd_free(color_name); - if (yiq_encode_name) - osd_free(yiq_encode_name); - if (yiq_decode_name) - osd_free(yiq_decode_name); - - initialized = true; - - return 0; -} - - -//============================================================ -// shaders::begin_draw -//============================================================ - -void shaders::begin_draw() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - - curr_effect = default_effect; - - (*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"); - (*d3dintf->effect.set_technique)(focus_effect, "TestTechnique"); - (*d3dintf->effect.set_technique)(deconverge_effect, "DeconvergeTechnique"); - (*d3dintf->effect.set_technique)(color_effect, "ColorTechnique"); - (*d3dintf->effect.set_technique)(yiq_encode_effect, "EncodeTechnique"); - (*d3dintf->effect.set_technique)(yiq_decode_effect, "DecodeTechnique"); - - 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); -} - - -//============================================================ -// shaders::begin_frame -//============================================================ - -void shaders::begin_frame() -{ - record_texture(); -} - - -//============================================================ -// shaders::blit -//============================================================ - -void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type, - UINT32 prim_index, UINT32 prim_count, int dstw, int dsth) -{ - renderer *d3d = (renderer *)window->drawdata; - - 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 = default_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src); - - (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)dstw); - (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)dsth); - (*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", 0.0f); - - unsigned int num_passes = 0; - (*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 - 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); - } - - (*d3dintf->effect.end)(curr_effect); - - if (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); - } -} - - - -//============================================================ -// shaders::blit -//============================================================ - -void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type, - UINT32 prim_index, UINT32 prim_count) -{ - renderer *d3d = (renderer *)window->drawdata; - - 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 = default_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src); - - (*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); - - unsigned int num_passes = 0; - (*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 - 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); - } - - (*d3dintf->effect.end)(curr_effect); - - (*d3dintf->effect.set_float)(curr_effect, "Brighten", 0.0f); - - if (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); - } -} - -//============================================================ -// shaders::end_frame -//============================================================ - -void shaders::end_frame() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - if(render_snap && snap_rendered) - { - render_snapshot(snap_target); - } - - if (!lines_pending) - return; - - lines_pending = false; - - /*render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); - if (rt == NULL) - { - return; - } - - blit(backbuffer, rt->render_texture[1], NULL, vecbuf_type, vecbuf_index, vecbuf_count); - - 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->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->get_device(), 0, backbuffer); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);*/ -} - - -//============================================================ -// shaders::init_effect_info -//============================================================ - -void shaders::init_effect_info(poly_info *poly) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - renderer *d3d = (renderer *)window->drawdata; - texture_info *texture = poly->get_texture(); - - 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->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", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset); - - if(options->params_dirty) - { - 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->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_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", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset); - (*d3dintf->effect.set_vector)(curr_effect, "Power", 3, options->power); - } - } - else - { - curr_effect = default_effect; - - (*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f); - } -} - - -//============================================================ -// shaders::find_render_target -//============================================================ - -render_target* shaders::find_render_target(texture_info *info) -{ - 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->get_texinfo().width || curr->height != info->get_texinfo().height)) - { - curr = curr->next; - } - - return curr; -} - - -//============================================================ -// shaders::find_render_target -//============================================================ - -render_target* shaders::find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index) -{ - render_target *curr = targethead; - - while (curr != NULL && (curr->width != width || curr->height != height || curr->screen_index != screen_index || curr->page_index != page_index)) - { - curr = curr->next; - } - - return curr; -} - - -//============================================================ -// shaders::find_cache_target -//============================================================ - -cache_target* shaders::find_cache_target(UINT32 screen_index, int width, int height) -{ - cache_target *curr = cachehead; - - while (curr != NULL && (curr->screen_index != screen_index || curr->width != width || curr->height != height)) - { - curr = curr->next; - } - - return curr; -} - - -//============================================================ -// shaders::render_quad -//============================================================ - -void shaders::render_quad(poly_info *poly, int vertnum) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - UINT num_passes = 0; - renderer *d3d = (renderer *)window->drawdata; - texture_info *texture = poly->get_texture(); - - if(PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && texture != NULL) - { - render_target *rt = find_render_target(texture); - if (rt == NULL) - { - return; - } - 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 - curr_effect = yiq_encode_effect; - - if(options->params_dirty) - { - (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / delta.c.x); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / delta.c.y); - (*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", (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); - (*d3dintf->effect.set_float)(curr_effect, "IFreqResponse", options->yiq_i); - (*d3dintf->effect.set_float)(curr_effect, "QFreqResponse", options->yiq_q); - (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time); - } - - 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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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 - curr_effect = yiq_decode_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->render_texture[4]); - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture->get_finaltex()); - if(true)//options->params_dirty) - { - (*d3dintf->effect.set_float)(curr_effect, "RawWidth", rawdims.c.x); - (*d3dintf->effect.set_float)(curr_effect, "RawHeight", rawdims.c.y); - (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / delta.c.x); - (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / delta.c.y); - (*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", (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); - (*d3dintf->effect.set_float)(curr_effect, "YFreqResponse", options->yiq_y); - (*d3dintf->effect.set_float)(curr_effect, "IFreqResponse", options->yiq_i); - (*d3dintf->effect.set_float)(curr_effect, "QFreqResponse", options->yiq_q); - (*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time); - } - - 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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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 = color_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[3]); - } - - curr_effect = color_effect; - - // Render the initial color-convolution pass - if(options->params_dirty) - { - (*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); - (*d3dintf->effect.set_vector)(curr_effect, "BluRatios", 3, options->blu_ratio); - (*d3dintf->effect.set_vector)(curr_effect, "Offset", 3, options->offset); - (*d3dintf->effect.set_vector)(curr_effect, "Scale", 3, options->scale); - (*d3dintf->effect.set_float)(curr_effect, "Saturation", options->saturation); - } - - 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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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 - 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->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->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->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->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 - 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->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); - (*d3dintf->effect.set_vector)(curr_effect, "RadialConvergeY", 3, options->radial_converge_y); - } - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - 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->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->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); - - float defocus_x = options->defocus[0]; - float defocus_y = options->defocus[1]; - bool focus_enable = defocus_x != 0.0f || defocus_y != 0.0f; - if(focus_enable) - { - // Defocus pass 1 - curr_effect = focus_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[2]); - - (*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->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->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->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 - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_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_vector)(curr_effect, "Defocus", 2, &options->defocus[1]); - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - 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->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); - } - - // Simulate phosphorescence. This should happen after the shadow/scanline pass, but since - // the phosphors are a direct result of the incoming texture, might as well just change the - // input texture. - curr_effect = phosphor_effect; - - if(options->params_dirty) - { - //(*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->render_texture[1] : rt->render_texture[2]); - (*d3dintf->effect.set_texture)(curr_effect, "LastPass", ct->last_texture); - - 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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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 - curr_effect = phosphor_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, "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->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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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 = post_effect; - (*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 - if(avi_output_file != NULL) - { - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - - 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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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(render_snap) - { - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - - 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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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); - - snap_rendered = true; - } - - // Scanlines and shadow mask - curr_effect = post_effect; - - //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()); - - 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 - (*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); - - (*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->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); - - 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->render_texture[2]); - (*d3dintf->effect.set_float)(curr_effect, "BloomRescale", options->raster_bloom_scale); - - float bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height(); - int bloom_index = 0; - float bloom_width = rt->target_width; - float bloom_height = rt->target_height; - float prim_width = poly->get_prim_width(); - float prim_height = poly->get_prim_height(); - float prim_ratio[2] = { prim_width / bloom_width, prim_height / bloom_height }; - float screen_size[2] = { d3d->get_width(), d3d->get_height() }; - //float target_size[2] = { bloom_width * 0.5f, bloom_height * 0.5f }; - (*d3dintf->effect.set_vector)(curr_effect, "ScreenSize", 2, screen_size); - for(; bloom_size >= 2.0f && bloom_index < 11; bloom_size *= 0.5f) - { - float target_size[2] = { bloom_width, bloom_height }; - float source_size[2] = { bloom_width * 0.5f, bloom_height * 0.5f }; - (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size); - (*d3dintf->effect.set_vector)(curr_effect, "SourceSize", 2, source_size); - (*d3dintf->effect.set_vector)(curr_effect, "PrimRatio", 2, prim_ratio); - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->render_texture[2] : rt->bloom_texture[bloom_index - 1]); - - 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->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); - - bloom_index++; - bloom_width *= 0.5f; - bloom_height *= 0.5f; - } - - // Bloom composite pass - curr_effect = bloom_effect; - - 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->render_texture[2]); - (*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f); - - char name[9] = "Diffuse*"; - char scale[14] = "DiffuseScale*"; - for(int index = 1; index < bloom_index; index++) - { - name[7] = 'A' + index; - scale[12] = 'A' + index; - (*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++) - { - name[7] = 'A' + index; - scale[12] = 'A' + index; - (*d3dintf->effect.set_texture)(curr_effect, name, black_texture); - (*d3dintf->effect.set_float)(curr_effect, scale, 0.0f); - } - - (*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 - //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 - 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->get_flags()) && vector_enable) - { - render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); - if (rt == NULL) - { - return; - } - - lines_pending = true; - - curr_effect = vector_effect; - - if(options->params_dirty) - { - (*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] = { 0.0f, 0.0f }; - 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->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->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->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 = default_effect; - - (*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f); - } - else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) - { - //if (!lines_pending) - //return; - //lines_pending = false; - - renderer *d3d = (renderer *)window->drawdata; - - render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); - if (rt == NULL) - { - return; - } - - /* Bloom */ - curr_effect = downsample_effect; - - (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]); - (*d3dintf->effect.set_float)(curr_effect, "BloomRescale", options->vector_bloom_scale); - - float bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height(); - int bloom_index = 0; - float bloom_width = rt->target_width; - float bloom_height = rt->target_height; - float prim_width = poly->get_prim_width(); - float prim_height = poly->get_prim_height(); - float prim_ratio[2] = { prim_width / bloom_width, prim_height / bloom_height }; - float screen_size[2] = { d3d->get_width(), d3d->get_height() }; - //float target_size[2] = { bloom_width * 0.5f, bloom_height * 0.5f }; - (*d3dintf->effect.set_vector)(curr_effect, "ScreenSize", 2, screen_size); - for(; bloom_size >= 2.0f && bloom_index < 11; bloom_size *= 0.5f) - { - float target_size[2] = { bloom_width, bloom_height }; - float source_size[2] = { bloom_width * 0.5f, bloom_height * 0.5f }; - (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size); - (*d3dintf->effect.set_vector)(curr_effect, "SourceSize", 2, source_size); - (*d3dintf->effect.set_vector)(curr_effect, "PrimRatio", 2, prim_ratio); - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - (*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->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->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); - - bloom_index++; - bloom_width *= 0.5f; - bloom_height *= 0.5f; - } - - // Bloom composite pass - curr_effect = bloom_effect; - - 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_texture)(curr_effect, "DiffuseA", rt->render_texture[0]); - (*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f); - - char name[9] = "Diffuse*"; - char scale[14] = "DiffuseScale*"; - for(int index = 1; index < bloom_index; index++) - { - name[7] = 'A' + index; - scale[12] = 'A' + index; - (*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++) - { - name[7] = 'A' + index; - scale[12] = 'A' + index; - (*d3dintf->effect.set_texture)(curr_effect, name, black_texture); - (*d3dintf->effect.set_float)(curr_effect, scale, 0.0f); - } - - (*d3dintf->effect.begin)(curr_effect, &num_passes, 0); - - 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->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->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); - - /* Phosphor */ - curr_effect = phosphor_effect; - - if(options->params_dirty) - { - (*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->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->render_texture[1]); - (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->render_texture[2]); - - 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->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); - - for (UINT pass = 0; pass < num_passes; pass++) - { - (*d3dintf->effect.begin_pass)(curr_effect, pass); - // add the primitives - 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); - - 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->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->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->get_device(), 0, backbuffer); - if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - - lines_pending = false; - } -#else - else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) - { - // Do nothing - } -#endif - else - { - 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.begin)(curr_effect, &num_passes, 0); - - 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->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); - } -} - - - -//============================================================ -// shaders::end_draw -//============================================================ - -void shaders::end_draw() -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - (*d3dintf->surface.release)(backbuffer); -} - - -//============================================================ -// shaders::register_prescaled_texture -//============================================================ - -bool shaders::register_prescaled_texture(texture_info *texture) -{ - return register_texture(texture); -} - - -//============================================================ -// shaders::add_cache_target - register a cache target -//============================================================ -bool shaders::add_cache_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index) -{ - cache_target* target = (cache_target*)global_alloc_clear(cache_target); - - if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale)) - { - global_free(target); - return false; - } - - if (info != NULL) - { - target->width = info->get_texinfo().width; - target->height = info->get_texinfo().height; - } - else - { - target->width = d3d->get_width(); - target->height = d3d->get_height(); - } - - target->next = cachehead; - target->prev = NULL; - - target->screen_index = screen_index; - - if (cachehead != NULL) - { - cachehead->prev = target; - } - cachehead = target; - - return true; -} - -render_target* shaders::get_vector_target() -{ -#if HLSL_VECTOR - if (!vector_enable) - { - return NULL; - } - - renderer *d3d = (renderer *)window->drawdata; - - return find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); -#else - return NULL; -#endif -} - -void shaders::create_vector_target(render_primitive *prim) -{ -#if HLSL_VECTOR - renderer *d3d = (renderer *)window->drawdata; - if (!add_render_target(d3d, NULL, d3d->get_width(), d3d->get_height(), 1, 1)) - { - vector_enable = false; - } -#endif -} - -//============================================================ -// shaders::add_render_target - register a render target -//============================================================ - -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) - { - render_target *existing_target = find_render_target(info); - if (existing_target != NULL) - { - remove_render_target(existing_target); - } - - UINT32 screen_index_data = (UINT32)info->get_texinfo().osddata; - screen_index = screen_index_data >> 1; - page_index = screen_index_data & 1; - } - else - { - render_target *existing_target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); - if (existing_target != NULL) - { - remove_render_target(existing_target); - } - } - - render_target* target = (render_target*)global_alloc_clear(render_target); - - if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale)) - { - global_free(target); - return false; - } - - if (info != NULL) - { - target->width = info->get_texinfo().width; - target->height = info->get_texinfo().height; - } - else - { - target->width = d3d->get_width(); - target->height = d3d->get_height(); - } - - 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->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->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; - - 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)) - { - global_free(target); - return false; - } - } - - target->next = targethead; - target->prev = NULL; - - if (targethead != NULL) - { - targethead->prev = target; - } - targethead = target; - - return true; -} - -//============================================================ -// shaders::enumerate_screens -//============================================================ -void shaders::enumerate_screens() -{ - screen_device_iterator iter(window->machine().root_device()); - num_screens = iter.count(); -} - - -//============================================================ -// shaders::register_texture(texture::info) -//============================================================ - -bool shaders::register_texture(texture_info *texture) -{ - int width = texture->get_width(); - int height = texture->get_height(); - int xscale = texture->get_xscale(); - int yscale = texture->get_yscale(); - - if (!master_enable || !d3dintf->post_fx_available) - { - return false; - } - - enumerate_screens(); - - renderer *d3d = (renderer *)window->drawdata; - - int hlsl_prescale_x = prescale_force_x; - int hlsl_prescale_y = prescale_force_y; - - // Find the nearest prescale factor that is over our screen size - if (hlsl_prescale_x == 0) - { - hlsl_prescale_x = 1; - while (width * xscale * hlsl_prescale_x <= d3d->get_width()) - { - hlsl_prescale_x++; - } - hlsl_prescale_x--; - } - - if (hlsl_prescale_y == 0) - { - hlsl_prescale_y = 1; - while (height * yscale * hlsl_prescale_y <= d3d->get_height()) - { - hlsl_prescale_y++; - } - hlsl_prescale_y--; - } - - hlsl_prescale_x = ((hlsl_prescale_x == 0) ? 1 : hlsl_prescale_x); - hlsl_prescale_y = ((hlsl_prescale_y == 0) ? 1 : hlsl_prescale_y); - - if (!add_render_target(d3d, texture, width, height, xscale * hlsl_prescale_x, yscale * hlsl_prescale_y)) - return false; - - options->params_dirty = true; - - return true; -} - -//============================================================ -// shaders::delete_resources -//============================================================ - -void shaders::delete_resources(bool reset) -{ - if (!master_enable || !d3dintf->post_fx_available) - return; - - initialized = false; - - 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((renderer*)window->drawdata, file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0); - - if (filerr != FILERR_NONE) - return; - - file.printf("hlsl_enable %d\n", master_enable ? 1 : 0); - file.printf("hlsl_prescale_x %d\n", prescale_force_x); - file.printf("hlsl_prescale_y %d\n", prescale_force_y); - file.printf("hlsl_preset %d\n", preset); - file.printf("hlsl_snap_width %d\n", snap_width); - file.printf("hlsl_snap_height %d\n", snap_height); - file.printf("shadow_mask_alpha %f\n", options->shadow_mask_alpha); - file.printf("shadow_mask_texture %s\n", options->shadow_mask_texture); - file.printf("shadow_mask_x_count %d\n", options->shadow_mask_count_x); - file.printf("shadow_mask_y_count %d\n", options->shadow_mask_count_y); - file.printf("shadow_mask_usize %f\n", options->shadow_mask_u_size); - file.printf("shadow_mask_vsize %f\n", options->shadow_mask_v_size); - file.printf("curvature %f\n", options->curvature); - file.printf("pincushion %f\n", options->pincushion); - file.printf("scanline_alpha %f\n", options->scanline_alpha); - file.printf("scanline_size %f\n", options->scanline_scale); - file.printf("scanline_height %f\n", options->scanline_height); - file.printf("scanline_bright_scale %f\n", options->scanline_bright_scale); - file.printf("scanline_bright_offset %f\n", options->scanline_bright_offset); - file.printf("scanline_jitter %f\n", options->scanline_offset); - file.printf("defocus %f,%f\n", options->defocus[0], options->defocus[1]); - file.printf("converge_x %f,%f,%f\n", options->converge_x[0], options->converge_x[1], options->converge_x[2]); - file.printf("converge_y %f,%f,%f\n", options->converge_y[0], options->converge_y[1], options->converge_y[2]); - file.printf("radial_converge_x %f,%f,%f\n", options->radial_converge_x[0], options->radial_converge_x[1], options->radial_converge_x[2]); - file.printf("radial_converge_y %f,%f,%f\n", options->radial_converge_y[0], options->radial_converge_y[1], options->radial_converge_y[2]); - file.printf("red_ratio %f,%f,%f\n", options->red_ratio[0], options->red_ratio[1], options->red_ratio[2]); - file.printf("grn_ratio %f,%f,%f\n", options->grn_ratio[0], options->grn_ratio[1], options->grn_ratio[2]); - file.printf("blu_ratio %f,%f,%f\n", options->blu_ratio[0], options->blu_ratio[1], options->blu_ratio[2]); - file.printf("saturation %f\n", options->saturation); - file.printf("offset %f,%f,%f\n", options->offset[0], options->offset[1], options->offset[2]); - file.printf("scale %f,%f,%f\n", options->scale[0], options->scale[1], options->scale[2]); - file.printf("power %f,%f,%f\n", options->power[0], options->power[1], options->power[2]); - file.printf("floor %f,%f,%f\n", options->floor[0], options->floor[1], options->floor[2]); - file.printf("phosphor_life %f,%f,%f\n", options->phosphor[0], options->phosphor[1], options->phosphor[2]); - file.printf("yiq_enable %d\n", options->yiq_enable ? 1 : 0); - file.printf("yiq_cc %f\n", options->yiq_cc); - file.printf("yiq_a %f\n", options->yiq_a); - file.printf("yiq_b %f\n", options->yiq_b); - file.printf("yiq_o %f\n", options->yiq_o); - file.printf("yiq_p %f\n", options->yiq_p); - file.printf("yiq_n %f\n", options->yiq_n); - file.printf("yiq_y %f\n", options->yiq_y); - file.printf("yiq_i %f\n", options->yiq_i); - file.printf("yiq_q %f\n", options->yiq_q); - file.printf("yiq_scan_time %f\n", options->yiq_scan_time); - file.printf("yiq_phase_count %d\n", options->yiq_phase_count); - file.printf("vector_length_scale %f\n", options->vector_length_scale); - file.printf("vector_length_ratio %f\n", options->vector_length_ratio); - } - - while (targethead != NULL) - { - remove_render_target(targethead); - } - -#if (HLSL_VECTOR || CRT_BLOOM) - if (downsample_effect != NULL) - { - (*d3dintf->effect.release)(downsample_effect); - downsample_effect = NULL; - } - if (bloom_effect != NULL) - { - (*d3dintf->effect.release)(bloom_effect); - bloom_effect = NULL; - } -#endif - if (default_effect != NULL) - { - (*d3dintf->effect.release)(default_effect); - default_effect = NULL; - } - if (post_effect != NULL) - { - (*d3dintf->effect.release)(post_effect); - post_effect = NULL; - } - if (prescale_effect != NULL) - { - (*d3dintf->effect.release)(prescale_effect); - prescale_effect = NULL; - } - if (pincushion_effect != NULL) - { - (*d3dintf->effect.release)(pincushion_effect); - pincushion_effect = NULL; - } - if (phosphor_effect != NULL) - { - (*d3dintf->effect.release)(phosphor_effect); - phosphor_effect = NULL; - } - if (focus_effect != NULL) - { - (*d3dintf->effect.release)(focus_effect); - focus_effect = NULL; - } - if (deconverge_effect != NULL) - { - (*d3dintf->effect.release)(deconverge_effect); - deconverge_effect = NULL; - } - if (color_effect != NULL) - { - (*d3dintf->effect.release)(color_effect); - color_effect = NULL; - } - if (yiq_encode_effect != NULL) - { - (*d3dintf->effect.release)(yiq_encode_effect); - yiq_encode_effect = NULL; - } - if (yiq_decode_effect != NULL) - { - (*d3dintf->effect.release)(yiq_decode_effect); - yiq_decode_effect = NULL; - } - - if (black_texture != NULL) - { - (*d3dintf->texture.release)(black_texture); - black_texture = NULL; - } - - if (avi_copy_texture != NULL) - { - (*d3dintf->texture.release)(avi_copy_texture); - avi_copy_texture = NULL; - } - - if (avi_copy_surface != NULL) - { - (*d3dintf->surface.release)(avi_copy_surface); - avi_copy_surface = NULL; - } - - if (avi_final_texture != NULL) - { - (*d3dintf->texture.release)(avi_final_texture); - avi_final_texture = NULL; - } - - if (avi_final_target != NULL) - { - (*d3dintf->surface.release)(avi_final_target); - avi_final_target = NULL; - } - - shadow_bitmap.reset(); -} - - -//============================================================ -// get_vector -//============================================================ - -static void get_vector(const char *data, int count, float *out, int report_error) -{ - if (count > 3) - { - if (sscanf(data, "%f,%f,%f,%f", &out[0], &out[1], &out[2], &out[3]) < 4 && report_error) - mame_printf_error("Illegal quad vector value = %s\n", data); - } - else if(count > 2) - { - if (sscanf(data, "%f,%f,%f", &out[0], &out[1], &out[2]) < 3 && report_error) - mame_printf_error("Illegal triple vector value = %s\n", data); - } - else if(count > 1) - { - if (sscanf(data, "%f,%f", &out[0], &out[1]) < 2 && report_error) - mame_printf_error("Illegal double vector value = %s\n", data); - } - else if(count > 0) - { - if (sscanf(data, "%f", &out[0]) < 1 && report_error) - mame_printf_error("Illegal single vector value = %s\n", data); - } -} - - -/*------------------------------------------------- - slider_alloc - allocate a new slider entry - currently duplicated from ui.c, this could - be done in a more ideal way. --------------------------------------------------*/ - -static slider_state *slider_alloc(running_machine &machine, const char *title, INT32 minval, INT32 defval, INT32 maxval, INT32 incval, slider_update update, void *arg) -{ - int size = sizeof(slider_state) + strlen(title); - slider_state *state = (slider_state *)auto_alloc_array_clear(machine, UINT8, size); - - state->minval = minval; - state->defval = defval; - state->maxval = maxval; - state->incval = incval; - state->update = update; - state->arg = arg; - strcpy(state->description, title); - - return state; -} - - -//============================================================ -// assorted global slider accessors -//============================================================ - -static INT32 slider_set(float *option, float scale, const char *fmt, astring *string, INT32 newval) -{ - if (option != NULL && newval != SLIDER_NOCHANGE) *option = (float)newval * scale; - if (string != NULL) string->printf(fmt, *option); - return floor(*option / scale + 0.5f); -} - -static INT32 slider_shadow_mask_alpha(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - return slider_set(&(((hlsl_options*)arg)->shadow_mask_alpha), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_shadow_mask_x_count(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - hlsl_options *options = (hlsl_options*)arg; - if (newval != SLIDER_NOCHANGE) options->shadow_mask_count_x = newval; - if (string != NULL) string->printf("%d", options->shadow_mask_count_x); - options->params_dirty = true; - return options->shadow_mask_count_x; -} - -static INT32 slider_shadow_mask_y_count(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - hlsl_options *options = (hlsl_options*)arg; - if (newval != SLIDER_NOCHANGE) options->shadow_mask_count_y = newval; - if (string != NULL) string->printf("%d", options->shadow_mask_count_y); - options->params_dirty = true; - return options->shadow_mask_count_y; -} - -static INT32 slider_shadow_mask_usize(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->shadow_mask_u_size), 1.0f / 32.0f, "%2.5f", string, newval); -} - -static INT32 slider_shadow_mask_vsize(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->shadow_mask_v_size), 1.0f / 32.0f, "%2.5f", string, newval); -} - -static INT32 slider_curvature(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->curvature), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_pincushion(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->pincushion), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_alpha(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_alpha), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_scale), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_height(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_height), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_bright_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_bright_scale), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_bright_offset(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_bright_offset), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_scanline_offset(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scanline_offset), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_defocus_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->defocus[0]), 0.5f, "%2.1f", string, newval); -} - -static INT32 slider_defocus_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->defocus[1]), 0.5f, "%2.1f", string, newval); -} - -static INT32 slider_red_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_x[0]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_red_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_y[0]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_green_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_x[1]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_green_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_y[1]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_blue_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_x[2]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_blue_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->converge_y[2]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_red_radial_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_x[0]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_red_radial_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_y[0]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_green_radial_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_x[1]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_green_radial_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_y[1]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_blue_radial_converge_x(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_x[2]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_blue_radial_converge_y(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->radial_converge_y[2]), 0.1f, "%3.1f", string, newval); -} - -static INT32 slider_red_from_r(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->red_ratio[0]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_red_from_g(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->red_ratio[1]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_red_from_b(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->red_ratio[2]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_green_from_r(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->grn_ratio[0]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_green_from_g(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->grn_ratio[1]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_green_from_b(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->grn_ratio[2]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_blue_from_r(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->blu_ratio[0]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_blue_from_g(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->blu_ratio[1]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_blue_from_b(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->blu_ratio[2]), 0.005f, "%2.3f", string, newval); -} - -static INT32 slider_red_offset(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->offset[0]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_green_offset(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->offset[1]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_blue_offset(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->offset[2]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_red_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scale[0]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_green_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scale[1]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_blue_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->scale[2]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_red_power(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->power[0]), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_green_power(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->power[1]), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_blue_power(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->power[2]), 0.05f, "%2.2f", string, newval); -} - -static INT32 slider_red_floor(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->floor[0]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_green_floor(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->floor[1]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_blue_floor(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->floor[2]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_red_phosphor_life(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->phosphor[0]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_green_phosphor_life(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->phosphor[1]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_blue_phosphor_life(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->phosphor[2]), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_saturation(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->saturation), 0.01f, "%2.2f", string, newval); -} - -static INT32 slider_vector_attenuation(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->vector_length_scale), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_vector_length_max(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->vector_length_ratio), 1.0f, "%4f", string, newval); -} - -static INT32 slider_vector_bloom_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->vector_bloom_scale), 0.001f, "%1.3f", string, newval); -} - -static INT32 slider_raster_bloom_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->raster_bloom_scale), 0.001f, "%1.3f", string, newval); -} - -static INT32 slider_bloom_lvl0_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level0_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl1_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level1_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl2_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level2_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl3_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level3_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl4_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level4_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl5_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level5_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl6_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level6_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl7_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level7_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl8_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level8_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl9_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level9_weight), 0.01f, "%1.2f", string, newval); -} - -static INT32 slider_bloom_lvl10_scale(running_machine &machine, void *arg, astring *string, INT32 newval) -{ - ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->bloom_level10_weight), 0.01f, "%1.2f", string, newval); -} - -//============================================================ -// init_slider_list -//============================================================ - -shaders::slider_desc shaders::s_sliders[] = -{ - { "Shadow Mask Darkness", 0, 0, 100, 1, slider_shadow_mask_alpha }, - { "Shadow Mask X Count", 1, 320, 1024, 1, slider_shadow_mask_x_count }, - { "Shadow Mask Y Count", 1, 240, 1024, 1, slider_shadow_mask_y_count }, - { "Shadow Mask Pixel Count X", 1, 6, 64, 1, slider_shadow_mask_usize }, - { "Shadow Mask Pixel Count Y", 1, 7, 64, 1, slider_shadow_mask_vsize }, - { "Shadow Mask Pixel Count Y", 1, 7, 64, 1, slider_shadow_mask_vsize }, - { "Shadow Mask Pixel Count Y", 1, 7, 64, 1, slider_shadow_mask_vsize }, - { "Shadow Mask Pixel Count Y", 1, 7, 64, 1, slider_shadow_mask_vsize }, - { "Screen Curvature", 0, 3, 100, 1, slider_curvature }, - { "Image Pincushion", 0, 3, 100, 1, slider_pincushion }, - { "Scanline Darkness", 0, 100, 100, 1, slider_scanline_alpha }, - { "Scanline Screen Height", 1, 20, 80, 1, slider_scanline_scale }, - { "Scanline Indiv. Height", 1, 20, 80, 1, slider_scanline_height }, - { "Scanline Brightness", 0, 20, 40, 1, slider_scanline_bright_scale }, - { "Scanline Brightness Overdrive", 0, 0, 20, 1, slider_scanline_bright_offset }, - { "Scanline Jitter", 0, 0, 40, 1, slider_scanline_offset }, - { "Defocus X", 0, 0, 64, 1, slider_defocus_x }, - { "Defocus Y", 0, 0, 64, 1, slider_defocus_y }, - { "Red Position Offset X", -1500, 3, 1500, 1, slider_red_converge_x }, - { "Red Position Offset Y", -1500, 0, 1500, 1, slider_red_converge_y }, - { "Green Position Offset X", -1500, 0, 1500, 1, slider_green_converge_x }, - { "Green Position Offset Y", -1500, 3, 1500, 1, slider_green_converge_y }, - { "Blue Position Offset X", -1500, 3, 1500, 1, slider_blue_converge_x }, - { "Blue Position Offset Y", -1500, 3, 1500, 1, slider_blue_converge_y }, - { "Red Convergence X", -1500, 0, 1500, 1, slider_red_radial_converge_x }, - { "Red Convergence Y", -1500, 0, 1500, 1, slider_red_radial_converge_y }, - { "Green Convergence X", -1500, 0, 1500, 1, slider_green_radial_converge_x }, - { "Green Convergence Y", -1500, 0, 1500, 1, slider_green_radial_converge_y }, - { "Blue Convergence X", -1500, 0, 1500, 1, slider_blue_radial_converge_x }, - { "Blue Convergence Y", -1500, 0, 1500, 1, slider_blue_radial_converge_y }, - { "Red Output from Red Input", -400, 0, 400, 5, slider_red_from_r }, - { "Red Output from Green Input", -400, 0, 400, 5, slider_red_from_g }, - { "Red Output from Blue Input", -400, 0, 400, 5, slider_red_from_b }, - { "Green Output from Red Input", -400, 0, 400, 5, slider_green_from_r }, - { "Green Output from Green Input", -400, 0, 400, 5, slider_green_from_g }, - { "Green Output from Blue Input", -400, 0, 400, 5, slider_green_from_b }, - { "Blue Output from Red Input", -400, 0, 400, 5, slider_blue_from_r }, - { "Blue Output from Green Input", -400, 0, 400, 5, slider_blue_from_g }, - { "Blue Output from Blue Input", -400, 0, 400, 5, slider_blue_from_b }, - { "Saturation", 0, 140, 400, 1, slider_saturation }, - { "Red DC Offset", -100, 0, 100, 1, slider_red_offset }, - { "Green DC Offset", -100, 0, 100, 1, slider_green_offset }, - { "Blue DC Offset", -100, 0, 100, 1, slider_blue_offset }, - { "Red Scale", -200, 95, 200, 1, slider_red_scale }, - { "Green Scale", -200, 95, 200, 1, slider_green_scale }, - { "Blue Scale", -200, 95, 200, 1, slider_blue_scale }, - { "Red Gamma", -80, 16, 80, 1, slider_red_power }, - { "Green Gamma", -80, 16, 80, 1, slider_green_power }, - { "Blue Gamma", -80, 16, 80, 1, slider_blue_power }, - { "Red Floor", 0, 5, 100, 1, slider_red_floor }, - { "Green Floor", 0, 5, 100, 1, slider_green_floor }, - { "Blue Floor", 0, 5, 100, 1, slider_blue_floor }, - { "Red Phosphor Life", 0, 40, 100, 1, slider_red_phosphor_life }, - { "Green Phosphor Life", 0, 40, 100, 1, slider_green_phosphor_life }, - { "Blue Phosphor Life", 0, 40, 100, 1, slider_blue_phosphor_life }, - { "Vector Length Attenuation", 0, 80, 100, 1, slider_vector_attenuation }, - { "Vector Attenuation Length Limit", 1, 500, 1000, 1, slider_vector_length_max }, - { "Vector Bloom Scale", 0, 300, 1000, 5, slider_vector_bloom_scale }, - { "Raster Bloom Scale", 0, 225, 1000, 5, slider_raster_bloom_scale }, - { "Bloom Level 0 Scale", 0, 100, 100, 1, slider_bloom_lvl0_scale }, - { "Bloom Level 1 Scale", 0, 21, 100, 1, slider_bloom_lvl1_scale }, - { "Bloom Level 2 Scale", 0, 19, 100, 1, slider_bloom_lvl2_scale }, - { "Bloom Level 3 Scale", 0, 17, 100, 1, slider_bloom_lvl3_scale }, - { "Bloom Level 4 Scale", 0, 15, 100, 1, slider_bloom_lvl4_scale }, - { "Bloom Level 5 Scale", 0, 14, 100, 1, slider_bloom_lvl5_scale }, - { "Bloom Level 6 Scale", 0, 13, 100, 1, slider_bloom_lvl6_scale }, - { "Bloom Level 7 Scale", 0, 12, 100, 1, slider_bloom_lvl7_scale }, - { "Bloom Level 8 Scale", 0, 11, 100, 1, slider_bloom_lvl8_scale }, - { "Bloom Level 9 Scale", 0, 10, 100, 1, slider_bloom_lvl9_scale }, - { "Bloom Level 10 Scale", 0, 9, 100, 1, slider_bloom_lvl10_scale }, - { NULL, 0, 0, 0, 0, NULL }, -}; - -slider_state *shaders::init_slider_list() -{ - if (!master_enable || !d3dintf->post_fx_available) - { - g_slider_list = NULL; - return NULL; - } - - slider_state *listhead = NULL; - slider_state **tailptr = &listhead; - - for (int index = 0; s_sliders[index].name != NULL; index++) - { - slider_desc *slider = &s_sliders[index]; - *tailptr = slider_alloc(window->machine(), slider->name, slider->minval, slider->defval, slider->maxval, slider->step, slider->adjustor, (void*)options); - tailptr = &(*tailptr)->next; - } - - return listhead; -} - -}; - -//============================================================ -// get_slider_list -//============================================================ - -void *windows_osd_interface::get_slider_list() -{ - return (void*)g_slider_list; -} - - - -// NOTE: The function below is taken directly from src/emu/video.c and should likely be moved into a global helper function. -//------------------------------------------------- -// open_next - open the next non-existing file of -// type filetype according to our numbering -// scheme -//------------------------------------------------- - -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->get_window()->machine().options().snap_name(); - - if (snapname == NULL || snapname[0] == 0) - snapname = "%g/%i"; - astring snapstr(snapname); - - // strip any extension in the provided name - int index = snapstr.rchr(0, '.'); - if (index != -1) - snapstr.substr(0, index); - - // handle %d in the template (for image devices) - astring snapdev("%d_"); - int pos = snapstr.find(0, snapdev); - - if (pos != -1) - { - // if more %d are found, revert to default and ignore them all - if (snapstr.find(pos + 3, snapdev) != -1) - snapstr.cpy("%g/%i"); - // else if there is a single %d, try to create the correct snapname - else - { - int name_found = 0; - - // find length of the device name - int end1 = snapstr.find(pos + 3, "/"); - int end2 = snapstr.find(pos + 3, "%"); - int end = -1; - - if ((end1 != -1) && (end2 != -1)) - end = MIN(end1, end2); - else if (end1 != -1) - end = end1; - else if (end2 != -1) - end = end2; - else - end = snapstr.len(); - - if (end - pos < 3) - fatalerror("Something very wrong is going on!!!\n"); - - // copy the device name to an astring - astring snapdevname; - snapdevname.cpysubstr(snapstr, pos + 3, end - pos - 3); - - // verify that there is such a device for this system - 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 - astring tempdevname(image->brief_instance_name()); - - if (snapdevname.cmp(tempdevname) == 0) - { - // verify that such a device has an image mounted - if (image->basename() != NULL) - { - astring filename(image->basename()); - - // strip extension - filename.substr(0, filename.rchr(0, '.')); - - // setup snapname and remove the %d_ - snapstr.replace(0, snapdevname, filename); - snapstr.del(pos, 3); - - name_found = 1; - } - } - } - - // or fallback to default - if (name_found == 0) - snapstr.cpy("%g/%i"); - } - } - - // add our own index - // add our own extension - snapstr.cat(".").cat(extension); - - // substitute path and gamename up front - snapstr.replace(0, "/", PATH_SEPARATOR); - 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; - if (snapstr.find(0, "%i") == -1) - fname.cpy(snapstr); - - // otherwise, we scan for the next available filename - else - { - // try until we succeed - astring seqtext; - file.set_openflags(OPEN_FLAG_READ); - for (int seq = 0; ; seq++) - { - // build up the filename - fname.cpy(snapstr).replace(0, "%i", seqtext.format("%04d_%d", seq, idx).cstr()); - - // try to open the file; stop when we fail - file_error filerr = file.open(fname); - if (filerr != FILERR_NONE) - break; - } - } - - // create the final file - file.set_openflags(origflags); - return file.open(fname); -} |