From bf033cfe00d4fbc49031468d32436b3f47886062 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Sun, 21 Feb 2016 03:03:05 +0100 Subject: [PATCH] Final fixups, get sliders working again, nw --- src/emu/ui/ui.cpp | 2 + src/emu/ui/ui.h | 1 + src/osd/modules/lib/osdobj_common.cpp | 1 + src/osd/modules/osdwindow.cpp | 8 +- src/osd/modules/osdwindow.h | 16 +- src/osd/modules/render/d3d/d3dhlsl.cpp | 279 ++++++++++++++++--------- src/osd/modules/render/d3d/d3dhlsl.h | 5 +- src/osd/modules/render/draw13.cpp | 36 ++-- src/osd/modules/render/draw13.h | 11 +- src/osd/modules/render/drawbgfx.h | 2 +- src/osd/modules/render/drawd3d.cpp | 11 +- src/osd/modules/render/drawd3d.h | 2 +- src/osd/modules/render/drawgdi.h | 2 +- src/osd/modules/render/drawnone.h | 2 +- src/osd/modules/render/drawogl.cpp | 4 +- src/osd/modules/render/drawogl.h | 4 +- src/osd/modules/render/drawsdl.cpp | 9 +- src/osd/modules/render/drawsdl.h | 9 +- src/osd/sdl/video.cpp | 5 +- src/osd/sdl/video.h | 1 + src/osd/sdl/window.cpp | 50 +++-- src/osd/windows/video.cpp | 24 +-- src/osd/windows/window.cpp | 127 ++++++++++- src/osd/windows/winmain.h | 7 +- 24 files changed, 424 insertions(+), 194 deletions(-) diff --git a/src/emu/ui/ui.cpp b/src/emu/ui/ui.cpp index b002560382c..b7babbc641e 100644 --- a/src/emu/ui/ui.cpp +++ b/src/emu/ui/ui.cpp @@ -1954,6 +1954,8 @@ static slider_state *slider_alloc(running_machine &machine, const char *title, I state->incval = incval; state->update = update; state->arg = arg; + state->hidden = false; + state->id = -1; strcpy(state->description, title); return state; diff --git a/src/emu/ui/ui.h b/src/emu/ui/ui.h index 8e0f81da9d2..43f54c0b243 100644 --- a/src/emu/ui/ui.h +++ b/src/emu/ui/ui.h @@ -104,6 +104,7 @@ struct slider_state INT32 maxval; /* maximum value */ INT32 incval; /* increment value */ bool hidden; /* hidden or not */ + INT32 id; /* unique identifier */ char description[1]; /* textual description */ }; diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp index 03ec77a2c27..7317876eaca 100644 --- a/src/osd/modules/lib/osdobj_common.cpp +++ b/src/osd/modules/lib/osdobj_common.cpp @@ -492,6 +492,7 @@ bool osd_common_t::font_get_bitmap(osd_font *font, unicode_char chnum, bitmap_ar slider_state* osd_common_t::get_slider_list() { + printf("Core get_slider_list\n"); return nullptr; } diff --git a/src/osd/modules/osdwindow.cpp b/src/osd/modules/osdwindow.cpp index 0f81a8a9ce7..3e17dd623fb 100644 --- a/src/osd/modules/osdwindow.cpp +++ b/src/osd/modules/osdwindow.cpp @@ -16,8 +16,10 @@ #include "render/drawnone.h" #include "render/drawbgfx.h" +#if (USE_OPENGL) #include "render/drawogl.h" -#if OSD_WINDOWS +#endif +#ifdef OSD_WINDOWS #include "render/drawgdi.h" #include "render/drawd3d.h" #else @@ -29,15 +31,17 @@ osd_renderer* osd_renderer::make_for_type(int mode, osd_window* window, int extr { switch(mode) { +#ifdef OSD_WINDOWS case VIDEO_MODE_NONE: return new renderer_none(window); +#endif case VIDEO_MODE_BGFX: return new renderer_bgfx(window); #if (USE_OPENGL) case VIDEO_MODE_OPENGL: return new renderer_ogl(window); #endif -#if OSD_WINDOWS +#ifdef OSD_WINDOWS case VIDEO_MODE_GDI: return new renderer_gdi(window); case VIDEO_MODE_D3D: diff --git a/src/osd/modules/osdwindow.h b/src/osd/modules/osdwindow.h index 10cbec5674f..5d9d7977968 100644 --- a/src/osd/modules/osdwindow.h +++ b/src/osd/modules/osdwindow.h @@ -12,6 +12,11 @@ #include "emu.h" #include "ui/ui.h" +#ifdef OSD_SDL +// standard SDL headers +#include "sdlinc.h" +#endif + //============================================================ // TYPE DEFINITIONS //============================================================ @@ -21,7 +26,7 @@ class render_primitive_list; enum { - VIDEO_MODE_NONE, + VIDEO_MODE_NONE = 0, VIDEO_MODE_GDI, VIDEO_MODE_BGFX, #if (USE_OPENGL) @@ -29,7 +34,9 @@ enum #endif VIDEO_MODE_SDL2ACCEL, VIDEO_MODE_D3D, - VIDEO_MODE_SOFT + VIDEO_MODE_SOFT, + + VIDEO_MODE_COUNT }; class osd_dim @@ -205,7 +212,7 @@ public: static const int FLAG_NEEDS_ASYNCBLIT = 0x0200; osd_renderer(osd_window *window, const int flags) - : m_window(window), m_flags(flags) { } + : m_sliders_dirty(false), m_window(window), m_flags(flags) { } virtual ~osd_renderer() { } @@ -219,7 +226,6 @@ public: /* Interface to be implemented by render code */ virtual int create() = 0; - virtual int init(running_machine &machine) = 0; virtual render_primitive_list *get_primitives() = 0; virtual slider_state* get_slider_list() { return nullptr; } @@ -228,12 +234,14 @@ public: virtual void save() { }; virtual void record() { }; virtual void toggle_fsfx() { }; + virtual bool sliders_dirty() { return m_sliders_dirty; } static osd_renderer* make_for_type(int mode, osd_window *window, int extra_flags = FLAG_NONE); protected: /* Internal flags */ static const int FI_CHANGED = 0x010000; + bool m_sliders_dirty; private: osd_window *m_window; diff --git a/src/osd/modules/render/d3d/d3dhlsl.cpp b/src/osd/modules/render/d3d/d3dhlsl.cpp index d7db252180c..776820b801f 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.cpp +++ b/src/osd/modules/render/d3d/d3dhlsl.cpp @@ -2206,7 +2206,7 @@ static void get_vector(const char *data, int count, float *out, bool report_erro // 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) +static slider_state *slider_alloc(running_machine &machine, int id, 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); @@ -2218,6 +2218,7 @@ static slider_state *slider_alloc(running_machine &machine, const char *title, I state->update = update; state->arg = arg; state->hidden = false; + state->id = id; strcpy(state->description, title); return state; @@ -2845,99 +2846,191 @@ static INT32 slider_ntsc_scan_time(running_machine &machine, void *arg, std::str hlsl_options shaders::last_options = { false }; +enum slider_option +{ + SLIDER_VECTOR_ATTENUATION = 0, + SLIDER_VECTOR_LENGTH_MAX, + SLIDER_SHADOW_MASK_TILE_MODE, + SLIDER_SHADOW_MASK_ALPHA, + SLIDER_SHADOW_MASK_X_COUNT, + SLIDER_SHADOW_MASK_Y_COUNT, + SLIDER_SHADOW_MASK_U_SIZE, + SLIDER_SHADOW_MASK_V_SIZE, + SLIDER_SHADOW_MASK_U_OFFSET, + SLIDER_SHADOW_MASK_V_OFFSET, + SLIDER_CURVATURE, + SLIDER_ROUND_CORNER, + SLIDER_SMOOTH_BORDER, + SLIDER_REFLECTION, + SLIDER_VIGNETTING, + SLIDER_SCANLINE_ALPHA, + SLIDER_SCANLINE_SCALE, + SLIDER_SCANLINE_HEIGHT, + SLIDER_SCANLINE_BRIGHT_SCALE, + SLIDER_SCANLINE_BRIGHT_OFFSET, + SLIDER_SCANLINE_JITTER, + SLIDER_HUM_BAR_ALPHA, + SLIDER_DEFOCUS_X, + SLIDER_DEFOCUS_Y, + SLIDER_RED_CONVERGE_X, + SLIDER_RED_CONVERGE_Y, + SLIDER_GREEN_CONVERGE_X, + SLIDER_GREEN_CONVERGE_Y, + SLIDER_BLUE_CONVERGE_X, + SLIDER_BLUE_CONVERGE_Y, + SLIDER_RED_RADIAL_CONVERGE_X, + SLIDER_RED_RADIAL_CONVERGE_Y, + SLIDER_GREEN_RADIAL_CONVERGE_X, + SLIDER_GREEN_RADIAL_CONVERGE_Y, + SLIDER_BLUE_RADIAL_CONVERGE_X, + SLIDER_BLUE_RADIAL_CONVERGE_Y, + SLIDER_RED_FROM_R, + SLIDER_RED_FROM_G, + SLIDER_RED_FROM_B, + SLIDER_GREEN_FROM_R, + SLIDER_GREEN_FROM_G, + SLIDER_GREEN_FROM_B, + SLIDER_BLUE_FROM_R, + SLIDER_BLUE_FROM_G, + SLIDER_BLUE_FROM_B, + SLIDER_SATURATION, + SLIDER_RED_OFFSET, + SLIDER_GREEN_OFFSET, + SLIDER_BLUE_OFFSET, + SLIDER_RED_SCALE, + SLIDER_GREEN_SCALE, + SLIDER_BLUE_SCALE, + SLIDER_RED_POWER, + SLIDER_GREEN_POWER, + SLIDER_BLUE_POWER, + SLIDER_RED_FLOOR, + SLIDER_GREEN_FLOOR, + SLIDER_BLUE_FLOOR, + SLIDER_RED_PHOSPHOR, + SLIDER_GREEN_PHOSPHOR, + SLIDER_BLUE_PHOSPHOR, + SLIDER_BLOOM_BLEND_MODE, + SLIDER_BLOOM_SCALE, + SLIDER_BLOOM_RED_OVERDRIVE, + SLIDER_BLOOM_GREEN_OVERDRIVE, + SLIDER_BLOOM_BLUE_OVERDRIVE, + SLIDER_BLOOM_LVL0_SCALE, + SLIDER_BLOOM_LVL1_SCALE, + SLIDER_BLOOM_LVL2_SCALE, + SLIDER_BLOOM_LVL3_SCALE, + SLIDER_BLOOM_LVL4_SCALE, + SLIDER_BLOOM_LVL5_SCALE, + SLIDER_BLOOM_LVL6_SCALE, + SLIDER_BLOOM_LVL7_SCALE, + SLIDER_BLOOM_LVL8_SCALE, + SLIDER_BLOOM_LVL9_SCALE, + SLIDER_BLOOM_LVL10_SCALE, + SLIDER_NTSC_ENABLE, + SLIDER_NTSC_JITTER, + SLIDER_NTSC_A_VALUE, + SLIDER_NTSC_B_VALUE, + SLIDER_NTSC_P_VALUE, + SLIDER_NTSC_O_VALUE, + SLIDER_NTSC_CC_VALUE, + SLIDER_NTSC_N_VALUE, + SLIDER_NTSC_Y_VALUE, + SLIDER_NTSC_I_VALUE, + SLIDER_NTSC_Q_VALUE, + SLIDER_NTSC_SCAN_TIME +}; + shaders::slider_desc shaders::s_sliders[] = { - { "Vector Length Attenuation", 0, 50, 100, 1, 2, slider_vector_attenuation }, - { "Vector Attenuation Length Limit", 1, 500, 1000, 1, 2, slider_vector_length_max }, - { "Shadow Mask Tile Mode", 0, 0, 1, 1, 7, slider_shadow_mask_tile_mode }, - { "Shadow Mask Darkness", 0, 0, 100, 1, 7, slider_shadow_mask_alpha }, - { "Shadow Mask X Count", 1, 1, 1024, 1, 7, slider_shadow_mask_x_count }, - { "Shadow Mask Y Count", 1, 1, 1024, 1, 7, slider_shadow_mask_y_count }, - { "Shadow Mask Pixel Count X", 1, 1, 64, 1, 7, slider_shadow_mask_usize }, - { "Shadow Mask Pixel Count Y", 1, 1, 64, 1, 7, slider_shadow_mask_vsize }, - { "Shadow Mask Offset X", -100, 0, 100, 1, 7, slider_shadow_mask_uoffset }, - { "Shadow Mask Offset Y", -100, 0, 100, 1, 7, slider_shadow_mask_voffset }, - { "Screen Curvature", 0, 0, 100, 1, 7, slider_curvature }, - { "Screen Round Corner", 0, 0, 100, 1, 7, slider_round_corner }, - { "Screen Smooth Border", 0, 0, 100, 1, 7, slider_smooth_border }, - { "Screen Reflection", 0, 0, 100, 1, 7, slider_reflection }, - { "Image Vignetting", 0, 0, 100, 1, 7, slider_vignetting }, - { "Scanline Darkness", 0, 0, 100, 1, 5, slider_scanline_alpha }, - { "Scanline Screen Height", 1, 20, 80, 1, 5, slider_scanline_scale }, - { "Scanline Indiv. Height", 1, 20, 80, 1, 5, slider_scanline_height }, - { "Scanline Brightness", 0, 20, 40, 1, 5, slider_scanline_bright_scale }, - { "Scanline Brightness Overdrive", 0, 0, 20, 1, 5, slider_scanline_bright_offset }, - { "Scanline Jitter", 0, 0, 100, 1, 5, slider_scanline_jitter }, - { "Hum Bar Darkness", 0, 0, 100, 1, 5, slider_hum_bar_alpha }, - { "Defocus X", 0, 0, 100, 1, 7, slider_defocus_x }, - { "Defocus Y", 0, 0, 100, 1, 7, slider_defocus_y }, - { "Red Position Offset X", -100, 0, 100, 1, 7, slider_red_converge_x }, - { "Red Position Offset Y", -100, 0, 100, 1, 7, slider_red_converge_y }, - { "Green Position Offset X", -100, 0, 100, 1, 7, slider_green_converge_x }, - { "Green Position Offset Y", -100, 0, 100, 1, 7, slider_green_converge_y }, - { "Blue Position Offset X", -100, 0, 100, 1, 7, slider_blue_converge_x }, - { "Blue Position Offset Y", -100, 0, 100, 1, 7, slider_blue_converge_y }, - { "Red Convergence X", -100, 0, 100, 1, 7, slider_red_radial_converge_x }, - { "Red Convergence Y", -100, 0, 100, 1, 7, slider_red_radial_converge_y }, - { "Green Convergence X", -100, 0, 100, 1, 7, slider_green_radial_converge_x }, - { "Green Convergence Y", -100, 0, 100, 1, 7, slider_green_radial_converge_y }, - { "Blue Convergence X", -100, 0, 100, 1, 7, slider_blue_radial_converge_x }, - { "Blue Convergence Y", -100, 0, 100, 1, 7, slider_blue_radial_converge_y }, - { "Red Output from Red Input", -400, 0, 400, 5, 7, slider_red_from_r }, - { "Red Output from Green Input", -400, 0, 400, 5, 7, slider_red_from_g }, - { "Red Output from Blue Input", -400, 0, 400, 5, 7, slider_red_from_b }, - { "Green Output from Red Input", -400, 0, 400, 5, 7, slider_green_from_r }, - { "Green Output from Green Input", -400, 0, 400, 5, 7, slider_green_from_g }, - { "Green Output from Blue Input", -400, 0, 400, 5, 7, slider_green_from_b }, - { "Blue Output from Red Input", -400, 0, 400, 5, 7, slider_blue_from_r }, - { "Blue Output from Green Input", -400, 0, 400, 5, 7, slider_blue_from_g }, - { "Blue Output from Blue Input", -400, 0, 400, 5, 7, slider_blue_from_b }, - { "Saturation", 0, 100, 400, 1, 7, slider_saturation }, - { "Red DC Offset", -100, 0, 100, 1, 7, slider_red_offset }, - { "Green DC Offset", -100, 0, 100, 1, 7, slider_green_offset }, - { "Blue DC Offset", -100, 0, 100, 1, 7, slider_blue_offset }, - { "Red Scale", -200, 100, 200, 1, 7, slider_red_scale }, - { "Green Scale", -200, 100, 200, 1, 7, slider_green_scale }, - { "Blue Scale", -200, 100, 200, 1, 7, slider_blue_scale }, - { "Red Gamma", -80, 0, 80, 1, 7, slider_red_power }, - { "Green Gamma", -80, 0, 80, 1, 7, slider_green_power }, - { "Blue Gamma", -80, 0, 80, 1, 7, slider_blue_power }, - { "Red Floor", 0, 0, 100, 1, 7, slider_red_floor }, - { "Green Floor", 0, 0, 100, 1, 7, slider_green_floor }, - { "Blue Floor", 0, 0, 100, 1, 7, slider_blue_floor }, - { "Red Phosphor Life", 0, 0, 100, 1, 7, slider_red_phosphor_life }, - { "Green Phosphor Life", 0, 0, 100, 1, 7, slider_green_phosphor_life }, - { "Blue Phosphor Life", 0, 0, 100, 1, 7, slider_blue_phosphor_life }, - { "Bloom Blend Mode", 0, 0, 1, 1, 7, slider_bloom_blend_mode }, - { "Bloom Scale", 0, 0, 2000, 5, 7, slider_bloom_scale }, - { "Bloom Red Overdrive", 0, 0, 2000, 5, 7, slider_bloom_red_overdrive }, - { "Bloom Green Overdrive", 0, 0, 2000, 5, 7, slider_bloom_green_overdrive }, - { "Bloom Blue Overdrive", 0, 0, 2000, 5, 7, slider_bloom_blue_overdrive }, - { "Bloom Level 0 Scale", 0, 100, 100, 1, 7, slider_bloom_lvl0_scale }, - { "Bloom Level 1 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl1_scale }, - { "Bloom Level 2 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl2_scale }, - { "Bloom Level 3 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl3_scale }, - { "Bloom Level 4 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl4_scale }, - { "Bloom Level 5 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl5_scale }, - { "Bloom Level 6 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl6_scale }, - { "Bloom Level 7 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl7_scale }, - { "Bloom Level 8 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl8_scale }, - { "Bloom Level 9 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl9_scale }, - { "Bloom Level 10 Scale", 0, 0, 100, 1, 7, slider_bloom_lvl10_scale }, - { "NTSC processing", 0, 0, 1, 1, 5, slider_ntsc_enable }, - { "Signal Jitter", 0, 0, 100, 1, 5, slider_ntsc_jitter }, - { "A Value", -100, 50, 100, 1, 5, slider_ntsc_a_value }, - { "B Value", -100, 50, 100, 1, 5, slider_ntsc_b_value }, - { "Incoming Pixel Clock Scaling", -300, 100, 300, 1, 5, slider_ntsc_p_value }, - { "Outgoing Color Carrier Phase", -300, 0, 300, 1, 5, slider_ntsc_o_value }, - { "Color Carrier Frequency", 0, 35795, 60000, 5, 5, slider_ntsc_cc_value }, - { "Y Notch", 0, 100, 600, 5, 5, slider_ntsc_n_value }, - { "Y Frequency", 0, 600, 600, 5, 5, slider_ntsc_y_value }, - { "I Frequency", 0, 120, 600, 5, 5, slider_ntsc_i_value }, - { "Q Frequency", 0, 60, 600, 5, 5, slider_ntsc_q_value }, - { "Scanline Duration", 0, 5260, 10000, 1, 5, slider_ntsc_scan_time }, - // { "Phase Count", 1, 2, 3, 1, 5, slider_ntsc_phase_count }, - { NULL, 0, 0, 0, 0, 0, NULL }, + { "Vector Length Attenuation", 0, 50, 100, 1, SLIDER_SCREEN_TYPE_VECTOR, slider_vector_attenuation, SLIDER_VECTOR_ATTENUATION }, + { "Vector Attenuation Length Limit", 1, 500, 1000, 1, SLIDER_SCREEN_TYPE_VECTOR, slider_vector_length_max, SLIDER_VECTOR_LENGTH_MAX }, + { "Shadow Mask Tile Mode", 0, 0, 1, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_tile_mode, SLIDER_SHADOW_MASK_TILE_MODE }, + { "Shadow Mask Darkness", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_alpha, SLIDER_SHADOW_MASK_ALPHA }, + { "Shadow Mask X Count", 1, 1, 1024, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_x_count, SLIDER_SHADOW_MASK_X_COUNT }, + { "Shadow Mask Y Count", 1, 1, 1024, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_y_count, SLIDER_SHADOW_MASK_Y_COUNT }, + { "Shadow Mask Pixel Count X", 1, 1, 64, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_usize, SLIDER_SHADOW_MASK_U_SIZE }, + { "Shadow Mask Pixel Count Y", 1, 1, 64, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_vsize, SLIDER_SHADOW_MASK_V_SIZE }, + { "Shadow Mask Offset X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_uoffset, SLIDER_SHADOW_MASK_U_OFFSET }, + { "Shadow Mask Offset Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_shadow_mask_voffset, SLIDER_SHADOW_MASK_V_OFFSET }, + { "Screen Curvature", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_curvature, SLIDER_CURVATURE }, + { "Screen Round Corner", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_round_corner, SLIDER_ROUND_CORNER }, + { "Screen Smooth Border", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_smooth_border, SLIDER_SMOOTH_BORDER }, + { "Screen Reflection", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_reflection, SLIDER_REFLECTION }, + { "Image Vignetting", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_vignetting, SLIDER_VIGNETTING }, + { "Scanline Darkness", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_alpha, SLIDER_SCANLINE_ALPHA }, + { "Scanline Screen Height", 1, 20, 80, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_scale, SLIDER_SCANLINE_SCALE }, + { "Scanline Indiv. Height", 1, 20, 80, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_height, SLIDER_SCANLINE_HEIGHT }, + { "Scanline Brightness", 0, 20, 40, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_bright_scale, SLIDER_SCANLINE_BRIGHT_SCALE }, + { "Scanline Brightness Overdrive", 0, 0, 20, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_bright_offset, SLIDER_SCANLINE_BRIGHT_OFFSET }, + { "Scanline Jitter", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_scanline_jitter, SLIDER_SCANLINE_JITTER }, + { "Hum Bar Darkness", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_hum_bar_alpha, SLIDER_HUM_BAR_ALPHA }, + { "Defocus X", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_defocus_x, SLIDER_DEFOCUS_X }, + { "Defocus Y", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_defocus_y, SLIDER_DEFOCUS_Y }, + { "Red Position Offset X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_converge_x, SLIDER_RED_CONVERGE_X }, + { "Red Position Offset Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_converge_y, SLIDER_RED_CONVERGE_Y }, + { "Green Position Offset X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_converge_x, SLIDER_GREEN_CONVERGE_X }, + { "Green Position Offset Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_converge_y, SLIDER_GREEN_CONVERGE_Y }, + { "Blue Position Offset X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_converge_x, SLIDER_BLUE_CONVERGE_X }, + { "Blue Position Offset Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_converge_y, SLIDER_BLUE_CONVERGE_Y }, + { "Red Convergence X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_radial_converge_x, SLIDER_RED_RADIAL_CONVERGE_X }, + { "Red Convergence Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_radial_converge_y, SLIDER_RED_RADIAL_CONVERGE_Y }, + { "Green Convergence X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_radial_converge_x, SLIDER_GREEN_RADIAL_CONVERGE_X }, + { "Green Convergence Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_radial_converge_y, SLIDER_GREEN_RADIAL_CONVERGE_Y }, + { "Blue Convergence X", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_radial_converge_x, SLIDER_BLUE_RADIAL_CONVERGE_X }, + { "Blue Convergence Y", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_radial_converge_y, SLIDER_BLUE_RADIAL_CONVERGE_Y }, + { "Red Output from Red Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_red_from_r, SLIDER_RED_FROM_R }, + { "Red Output from Green Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_red_from_g, SLIDER_RED_FROM_G }, + { "Red Output from Blue Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_red_from_b, SLIDER_RED_FROM_B }, + { "Green Output from Red Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_green_from_r, SLIDER_GREEN_FROM_R }, + { "Green Output from Green Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_green_from_g, SLIDER_GREEN_FROM_G }, + { "Green Output from Blue Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_green_from_b, SLIDER_GREEN_FROM_B }, + { "Blue Output from Red Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_blue_from_r, SLIDER_BLUE_FROM_R }, + { "Blue Output from Green Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_blue_from_g, SLIDER_BLUE_FROM_G }, + { "Blue Output from Blue Input", -400, 0, 400, 5, SLIDER_SCREEN_TYPE_ANY, slider_blue_from_b, SLIDER_BLUE_FROM_B }, + { "Saturation", 0, 100, 400, 1, SLIDER_SCREEN_TYPE_ANY, slider_saturation, SLIDER_SATURATION }, + { "Red DC Offset", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_offset, SLIDER_RED_OFFSET }, + { "Green DC Offset", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_offset, SLIDER_GREEN_OFFSET }, + { "Blue DC Offset", -100, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_offset, SLIDER_BLUE_OFFSET }, + { "Red Scale", -200, 100, 200, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_scale, SLIDER_RED_SCALE }, + { "Green Scale", -200, 100, 200, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_scale, SLIDER_GREEN_SCALE }, + { "Blue Scale", -200, 100, 200, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_scale, SLIDER_BLUE_SCALE }, + { "Red Gamma", -80, 0, 80, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_power, SLIDER_RED_POWER }, + { "Green Gamma", -80, 0, 80, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_power, SLIDER_GREEN_POWER }, + { "Blue Gamma", -80, 0, 80, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_power, SLIDER_BLUE_POWER }, + { "Red Floor", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_floor, SLIDER_RED_FLOOR }, + { "Green Floor", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_floor, SLIDER_GREEN_FLOOR }, + { "Blue Floor", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_floor, SLIDER_BLUE_FLOOR }, + { "Red Phosphor Life", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_red_phosphor_life, SLIDER_RED_PHOSPHOR }, + { "Green Phosphor Life", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_green_phosphor_life, SLIDER_GREEN_PHOSPHOR }, + { "Blue Phosphor Life", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_blue_phosphor_life, SLIDER_BLUE_PHOSPHOR }, + { "Bloom Blend Mode", 0, 0, 1, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_blend_mode, SLIDER_BLOOM_BLEND_MODE }, + { "Bloom Scale", 0, 0, 2000, 5, SLIDER_SCREEN_TYPE_ANY, slider_bloom_scale, SLIDER_BLOOM_SCALE }, + { "Bloom Red Overdrive", 0, 0, 2000, 5, SLIDER_SCREEN_TYPE_ANY, slider_bloom_red_overdrive, SLIDER_BLOOM_RED_OVERDRIVE }, + { "Bloom Green Overdrive", 0, 0, 2000, 5, SLIDER_SCREEN_TYPE_ANY, slider_bloom_green_overdrive, SLIDER_BLOOM_GREEN_OVERDRIVE }, + { "Bloom Blue Overdrive", 0, 0, 2000, 5, SLIDER_SCREEN_TYPE_ANY, slider_bloom_blue_overdrive, SLIDER_BLOOM_BLUE_OVERDRIVE }, + { "Bloom Level 0 Scale", 0, 100, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl0_scale, SLIDER_BLOOM_LVL0_SCALE }, + { "Bloom Level 1 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl1_scale, SLIDER_BLOOM_LVL1_SCALE }, + { "Bloom Level 2 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl2_scale, SLIDER_BLOOM_LVL2_SCALE }, + { "Bloom Level 3 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl3_scale, SLIDER_BLOOM_LVL3_SCALE }, + { "Bloom Level 4 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl4_scale, SLIDER_BLOOM_LVL4_SCALE }, + { "Bloom Level 5 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl5_scale, SLIDER_BLOOM_LVL5_SCALE }, + { "Bloom Level 6 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl6_scale, SLIDER_BLOOM_LVL6_SCALE }, + { "Bloom Level 7 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl7_scale, SLIDER_BLOOM_LVL7_SCALE }, + { "Bloom Level 8 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl8_scale, SLIDER_BLOOM_LVL8_SCALE }, + { "Bloom Level 9 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl9_scale, SLIDER_BLOOM_LVL9_SCALE }, + { "Bloom Level 10 Scale", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_ANY, slider_bloom_lvl10_scale, SLIDER_BLOOM_LVL10_SCALE }, + { "NTSC processing", 0, 0, 1, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_enable, SLIDER_NTSC_ENABLE }, + { "Signal Jitter", 0, 0, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_jitter, SLIDER_NTSC_JITTER }, + { "A Value", -100, 50, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_a_value, SLIDER_NTSC_A_VALUE }, + { "B Value", -100, 50, 100, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_b_value, SLIDER_NTSC_B_VALUE }, + { "Incoming Pixel Clock Scaling", -300, 100, 300, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_p_value, SLIDER_NTSC_P_VALUE }, + { "Outgoing Color Carrier Phase", -300, 0, 300, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_o_value, SLIDER_NTSC_O_VALUE }, + { "Color Carrier Frequency", 0, 35795, 60000, 5, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_cc_value, SLIDER_NTSC_CC_VALUE }, + { "Y Notch", 0, 100, 600, 5, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_n_value, SLIDER_NTSC_N_VALUE }, + { "Y Frequency", 0, 600, 600, 5, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_y_value, SLIDER_NTSC_Y_VALUE }, + { "I Frequency", 0, 120, 600, 5, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_i_value, SLIDER_NTSC_I_VALUE }, + { "Q Frequency", 0, 60, 600, 5, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_q_value, SLIDER_NTSC_Q_VALUE }, + { "Scanline Duration", 0, 5260, 10000, 1, SLIDER_SCREEN_TYPE_LCD_OR_RASTER, slider_ntsc_scan_time, SLIDER_NTSC_SCAN_TIME }, + { NULL, 0, 0, 0, 0, 0, NULL, -1 }, }; @@ -2965,7 +3058,7 @@ slider_state *shaders::init_slider_list() (screen_type == SCREEN_TYPE_RASTER && (slider->screen_type & SLIDER_SCREEN_TYPE_RASTER) == SLIDER_SCREEN_TYPE_RASTER) || (screen_type == SCREEN_TYPE_LCD && (slider->screen_type & SLIDER_SCREEN_TYPE_LCD) == SLIDER_SCREEN_TYPE_LCD)) { - *tailptr = slider_alloc(*machine, slider->name, slider->minval, slider->defval, slider->maxval, slider->step, slider->adjustor, (void*)options); + *tailptr = slider_alloc(*machine, slider->id, slider->name, slider->minval, slider->defval, slider->maxval, slider->step, slider->adjustor, (void*)options); tailptr = &(*tailptr)->next; } } diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index a86505a1c96..a42e9995767 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -320,7 +320,9 @@ public: SLIDER_SCREEN_TYPE_NONE = 0, SLIDER_SCREEN_TYPE_RASTER = 1, SLIDER_SCREEN_TYPE_VECTOR = 2, - SLIDER_SCREEN_TYPE_LCD = 4 + SLIDER_SCREEN_TYPE_LCD = 4, + SLIDER_SCREEN_TYPE_LCD_OR_RASTER = SLIDER_SCREEN_TYPE_RASTER | SLIDER_SCREEN_TYPE_LCD, + SLIDER_SCREEN_TYPE_ANY = SLIDER_SCREEN_TYPE_RASTER | SLIDER_SCREEN_TYPE_VECTOR | SLIDER_SCREEN_TYPE_LCD }; struct slider_desc @@ -332,6 +334,7 @@ public: int step; int screen_type; INT32(*adjustor)(running_machine &, void *, std::string *, INT32); + int id; }; private: diff --git a/src/osd/modules/render/draw13.cpp b/src/osd/modules/render/draw13.cpp index e210d2044df..efecc4bef68 100644 --- a/src/osd/modules/render/draw13.cpp +++ b/src/osd/modules/render/draw13.cpp @@ -84,7 +84,7 @@ renderer_sdl1::renderer_sdl1(osd_window *window, int extra_flags) * prohibit fullscreen toggling. It is than not possible * to toggle from fullscreen to window mode. */ - expand_copy_info(blit_info_default); + expand_copy_info(s_blit_info_default); s_blit_info_initialized = true; } } @@ -180,7 +180,7 @@ const copy_info_t renderer_sdl1::s_blit_info_default[] = { -1 }, }; -copy_info_t* renderer_sdl::s_blit_info[SDL_TEXFORMAT_LAST+1] = { NULL }; +copy_info_t* renderer_sdl1::s_blit_info[SDL_TEXFORMAT_LAST+1] = { NULL }; bool renderer_sdl1::s_blit_info_initialized = false; //============================================================ @@ -216,7 +216,7 @@ static inline SDL_BlendMode map_blendmode(const int blendmode) return SDL_BLENDMODE_NONE; } -void renderer_sdl1::set_coloralphamode(SDL_Texture *texture_id, const render_color *color) +void texture_info::set_coloralphamode(SDL_Texture *texture_id, const render_color *color) { UINT32 sr = (UINT32)(255.0f * color->r); UINT32 sg = (UINT32)(255.0f * color->g); @@ -333,7 +333,7 @@ int renderer_sdl1::RendererSupportsFormat(Uint32 format, Uint32 access, const ch // drawsdl_init //============================================================ -static void add_list(copy_info_t **head, copy_info_t *element, Uint32 bm) +void renderer_sdl1::add_list(copy_info_t **head, const copy_info_t *element, Uint32 bm) { copy_info_t *newci = global_alloc(copy_info_t); *newci = *element; @@ -343,11 +343,9 @@ static void add_list(copy_info_t **head, copy_info_t *element, Uint32 bm) *head = newci; } -static void expand_copy_info(copy_info_t *list) +void renderer_sdl1::expand_copy_info(const copy_info_t *list) { - copy_info_t *bi; - - for (bi = list; bi->src_fmt != -1; bi++) + for (const copy_info_t *bi = list; bi->src_fmt != -1; bi++) { if (bi->bm_mask == BM_ALL) { @@ -357,17 +355,14 @@ static void expand_copy_info(copy_info_t *list) add_list(&s_blit_info[bi->src_fmt], bi, SDL_BLENDMODE_BLEND); } else + { add_list(&s_blit_info[bi->src_fmt], bi, bi->bm_mask); + } } } -static osd_renderer *drawsdl2_create(osd_window *window) -{ - return global_alloc(renderer_sdl1(window, osd_renderer::FLAG_NONE)); -} - // FIXME: machine only used to access options. -int renderer_sdl1::init(running_machine &machine) +bool renderer_sdl1::init(running_machine &machine) { osd_printf_verbose("Using SDL native texturing driver (SDL 2.0+)\n"); @@ -386,7 +381,7 @@ int renderer_sdl1::init(running_machine &machine) else osd_printf_verbose("Loaded opengl shared library: %s\n", stemp ? stemp : ""); - return 0; + return false; } @@ -615,11 +610,10 @@ int renderer_sdl1::draw(int update) copy_info_t *texture_info::compute_size_type() { - copy_info_t *bi; copy_info_t *result = NULL; int maxperf = 0; - for (bi = blit_info[m_format]; bi != NULL; bi = bi->next) + for (copy_info_t *bi = renderer_sdl1::s_blit_info[m_format]; bi != NULL; bi = bi->next) { if ((m_is_rotated == bi->blitter->m_is_rot) && (m_sdl_blendmode == bi->bm_mask)) @@ -637,10 +631,12 @@ copy_info_t *texture_info::compute_size_type() } } } + if (result) return result; + /* try last resort handlers */ - for (bi = blit_info[m_format]; bi != NULL; bi = bi->next) + for (copy_info_t *bi = renderer_sdl1::s_blit_info[m_format]; bi != NULL; bi = bi->next) { if ((m_is_rotated == bi->blitter->m_is_rot) && (m_sdl_blendmode == bi->bm_mask)) @@ -906,7 +902,7 @@ texture_info *renderer_sdl1::texture_find(const render_primitive &prim, const qu // texture_update //============================================================ -texture_info * renderer_sdl3::texture_update(const render_primitive &prim) +texture_info * renderer_sdl1::texture_update(const render_primitive &prim) { quad_setup_data setup; texture_info *texture; @@ -936,7 +932,7 @@ texture_info * renderer_sdl3::texture_update(const render_primitive &prim) return texture; } -render_primitive_list *renderer_sdl13::get_primitives() +render_primitive_list *renderer_sdl1::get_primitives() { osd_dim nd = window().blit_surface_size(); if (nd != m_blit_dim) diff --git a/src/osd/modules/render/draw13.h b/src/osd/modules/render/draw13.h index 584820ab2d9..f5010bd8e3e 100644 --- a/src/osd/modules/render/draw13.h +++ b/src/osd/modules/render/draw13.h @@ -88,6 +88,8 @@ public: bool is_pixels_owned() const; private: + void set_coloralphamode(SDL_Texture *texture_id, const render_color *color); + Uint32 m_sdl_access; renderer_sdl1 * m_renderer; render_texinfo m_texinfo; // copy of the texture info @@ -176,7 +178,7 @@ public: } virtual int create() override; - virtual int init(running_machine &machine) override; + static bool init(running_machine &machine); virtual int draw(const int update) override; virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) override; virtual render_primitive_list *get_primitives() override; @@ -184,9 +186,13 @@ public: SDL_Renderer * m_sdl_renderer; + static copy_info_t* s_blit_info[SDL_TEXFORMAT_LAST+1]; + private: + void expand_copy_info(const copy_info_t *list); + void add_list(copy_info_t **head, const copy_info_t *element, Uint32 bm); + void render_quad(texture_info *texture, const render_primitive *prim, const int x, const int y); - void set_coloralphamode(SDL_Texture *texture_id, const render_color *color); texture_info *texture_find(const render_primitive &prim, const quad_setup_data &setup); texture_info *texture_update(const render_primitive &prim); @@ -216,7 +222,6 @@ private: INT64 m_last_blit_time; INT64 m_last_blit_pixels; - static copy_info_t* s_blit_info[SDL_TEXFORMAT_LAST+1]; static bool s_blit_info_initialized; static const copy_info_t s_blit_info_default[]; }; diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h index 2cb26dd8eae..7ce7c75a1de 100644 --- a/src/osd/modules/render/drawbgfx.h +++ b/src/osd/modules/render/drawbgfx.h @@ -31,7 +31,7 @@ public: virtual int create() override; virtual slider_state* get_slider_list() override; - virtual int init(running_machine &machine) override { return 0; } + static bool init(running_machine &machine) { return false; } virtual int draw(const int update) override; #ifdef OSD_SDL virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) override; diff --git a/src/osd/modules/render/drawd3d.cpp b/src/osd/modules/render/drawd3d.cpp index 83f94864495..3873e6fbcea 100644 --- a/src/osd/modules/render/drawd3d.cpp +++ b/src/osd/modules/render/drawd3d.cpp @@ -219,7 +219,7 @@ render_primitive_list *renderer_d3d9::get_primitives() // drawnone_create //============================================================ -int renderer_d3d9::init(running_machine &machine) +bool renderer_d3d9::init(running_machine &machine) { // Use Direct3D9 d3dintf = drawd3d9_init(); @@ -228,10 +228,10 @@ int renderer_d3d9::init(running_machine &machine) if (d3dintf == nullptr) { osd_printf_error("Unable to initialize Direct3D.\n"); - return 1; + return true; } - return 0; + return false; } @@ -576,11 +576,15 @@ int renderer_d3d9::initialize() { // configure the adapter for the mode we want if (config_adapter_mode()) + { return false; + } // create the device immediately for the full screen case (defer for window mode) if (window().fullscreen() && device_create(window().m_focus_hwnd)) + { return false; + } return true; } @@ -870,6 +874,7 @@ try_again: m_shaders = (shaders*)global_alloc_clear(); m_shaders->init(d3dintf, &window().machine(), this); + m_sliders_dirty = true; int failed = m_shaders->create_resources(false); if (failed) diff --git a/src/osd/modules/render/drawd3d.h b/src/osd/modules/render/drawd3d.h index 35bd5f1843b..31246f5baf8 100644 --- a/src/osd/modules/render/drawd3d.h +++ b/src/osd/modules/render/drawd3d.h @@ -43,7 +43,7 @@ public: virtual int create() override; virtual slider_state* get_slider_list() override; - virtual int init(running_machine &machine) override; + static bool init(running_machine &machine); virtual render_primitive_list *get_primitives() override; virtual int draw(const int update) override; virtual void save() override; diff --git a/src/osd/modules/render/drawgdi.h b/src/osd/modules/render/drawgdi.h index 4782e83413d..f6f3d328dfc 100644 --- a/src/osd/modules/render/drawgdi.h +++ b/src/osd/modules/render/drawgdi.h @@ -38,7 +38,7 @@ public: virtual ~renderer_gdi(); virtual int create() override; - virtual int init(running_machine &machine) override { return 0; } + static bool init(running_machine &machine) { return false; } virtual render_primitive_list *get_primitives() override; virtual int draw(const int update) override; virtual void save() override {}; diff --git a/src/osd/modules/render/drawnone.h b/src/osd/modules/render/drawnone.h index 621be08527c..e6f49aa1727 100644 --- a/src/osd/modules/render/drawnone.h +++ b/src/osd/modules/render/drawnone.h @@ -23,7 +23,7 @@ public: virtual ~renderer_none() { } virtual int create() override { return 0; } - virtual int init(running_machine &machine) override { return 0; } + static bool init(running_machine &machine) { return false; } virtual render_primitive_list *get_primitives() override; virtual int draw(const int update) override { return 0; } virtual void save() override { } diff --git a/src/osd/modules/render/drawogl.cpp b/src/osd/modules/render/drawogl.cpp index e85649534b9..e90d74a40e6 100644 --- a/src/osd/modules/render/drawogl.cpp +++ b/src/osd/modules/render/drawogl.cpp @@ -277,7 +277,7 @@ static void texture_set_data(ogl_texture_info *texture, const render_texinfo *te bool renderer_ogl::s_shown_video_info = false; bool renderer_ogl::s_dll_loaded = false; -int renderer_ogl::init(running_machine &machine) +bool renderer_ogl::init(running_machine &machine) { s_dll_loaded = false; @@ -288,7 +288,7 @@ int renderer_ogl::init(running_machine &machine) osd_printf_verbose("Using SDL multi-window OpenGL driver (SDL 2.0+)\n"); #endif - return 0; + return false; } //============================================================ diff --git a/src/osd/modules/render/drawogl.h b/src/osd/modules/render/drawogl.h index 6407588e421..5c96277f247 100644 --- a/src/osd/modules/render/drawogl.h +++ b/src/osd/modules/render/drawogl.h @@ -131,7 +131,7 @@ public: virtual ~renderer_ogl(); virtual int create() override; - virtual int init(running_machine &machine) override; + static bool init(running_machine &machine); virtual int draw(const int update) override; #ifndef OSD_WINDOWS @@ -165,7 +165,7 @@ private: void destroy_all_textures(); - void load_gl_lib(running_machine &machine); + static void load_gl_lib(running_machine &machine); void loadGLExtensions(); void initialize_gl(); void set_blendmode(int blendmode); diff --git a/src/osd/modules/render/drawsdl.cpp b/src/osd/modules/render/drawsdl.cpp index c7b2cd5197e..005d523cf9a 100644 --- a/src/osd/modules/render/drawsdl.cpp +++ b/src/osd/modules/render/drawsdl.cpp @@ -44,9 +44,6 @@ // PROTOTYPES //============================================================ -// core functions -static void drawsdl_exit(void); - // YUV overlays static void yuv_RGB_to_YV12(const UINT16 *bitmap, UINT8 *ptr, const int pitch, \ @@ -93,10 +90,10 @@ int drawsdl_scale_mode(const char *s) // drawsdl_init //============================================================ -int renderer_sdl2::init(running_machine &machine) +bool renderer_sdl2::init(running_machine &machine) { osd_printf_verbose("Using SDL multi-window soft driver (SDL 2.0+)\n"); - return 0; + return false; } //============================================================ @@ -154,7 +151,7 @@ void renderer_sdl2::setup_texture(const osd_dim &size) // drawsdl_show_info //============================================================ -void renderer_sdl::show_info(struct SDL_RendererInfo *render_info) +void renderer_sdl2::show_info(struct SDL_RendererInfo *render_info) { #define RF_ENTRY(x) {x, #x } static struct diff --git a/src/osd/modules/render/drawsdl.h b/src/osd/modules/render/drawsdl.h index d22c27f8c6f..e98e1835df2 100644 --- a/src/osd/modules/render/drawsdl.h +++ b/src/osd/modules/render/drawsdl.h @@ -36,12 +36,13 @@ public: } virtual ~renderer_sdl2(); - /* virtual */ int create() override; - /* virtual */ int init(running_machine &machine) override; - /* virtual */ int draw(const int update) override; - /* virtual */ int xy_to_render_target(const int x, const int y, int *xt, int *yt) override; + virtual int create() override; + virtual int draw(const int update) override; + virtual int xy_to_render_target(const int x, const int y, int *xt, int *yt) override; virtual render_primitive_list *get_primitives() override; + static bool init(running_machine &machine); + private: void show_info(struct SDL_RendererInfo *render_info); diff --git a/src/osd/sdl/video.cpp b/src/osd/sdl/video.cpp index ca7286d5696..b0d2e383c11 100644 --- a/src/osd/sdl/video.cpp +++ b/src/osd/sdl/video.cpp @@ -83,7 +83,7 @@ bool sdl_osd_interface::video_init() get_resolution(options().resolution(), options().resolution(index), &conf, TRUE); // create window ... - sdl_window_info *win = global_alloc(sdl_window_info(machine(), index, sdl_monitor_info::pick_monitor(options(), index), &conf)); + sdl_window_info *win = global_alloc(sdl_window_info(machine(), index, osd_monitor_info::pick_monitor(reinterpret_cast(options()), index), &conf)); if (win->window_init()) return false; @@ -229,8 +229,9 @@ void sdl_monitor_info::exit() // pick_monitor //============================================================ -osd_monitor_info *osd_monitor_info::pick_monitor(sdl_options &options, int index) +osd_monitor_info *osd_monitor_info::pick_monitor(osd_options &generic_options, int index) { + sdl_options &options = reinterpret_cast(generic_options); osd_monitor_info *monitor; const char *scrname, *scrname2; int moncount = 0; diff --git a/src/osd/sdl/video.h b/src/osd/sdl/video.h index 3b2c5ea81cd..307f3a898c9 100644 --- a/src/osd/sdl/video.h +++ b/src/osd/sdl/video.h @@ -12,6 +12,7 @@ #define __SDLVIDEO__ #include "osdsdl.h" +#include "modules/osdwindow.h" //============================================================ // CONSTANTS diff --git a/src/osd/sdl/window.cpp b/src/osd/sdl/window.cpp index 0f7b86e6611..49e8ed48477 100644 --- a/src/osd/sdl/window.cpp +++ b/src/osd/sdl/window.cpp @@ -36,6 +36,12 @@ #include "window.h" #include "input.h" #include "osdsdl.h" +#include "modules/render/drawbgfx.h" +#include "modules/render/drawsdl.h" +#include "modules/render/draw13.h" +#if (USE_OPENGL) +#include "modules/render/drawogl.h" +#endif //============================================================ // PARAMETERS @@ -221,13 +227,37 @@ bool sdl_osd_interface::window_init() } // initialize the drawers - if (m_renderer->init(machine())) - video_config.mode = VIDEO_MODE_SOFT; - + if (video_config.mode == VIDEO_MODE_BGFX) + { + if (renderer_bgfx::init(machine())) + { +#if (USE_OPENGL) + video_config.mode = VIDEO_MODE_OPENGL; + } + } + if (video_config.mode == VIDEO_MODE_OPENGL) + { + if (renderer_ogl::init(machine())) + { + video_config.mode = VIDEO_MODE_SOFT; +#else + video_config.mode = VIDEO_MODE_SOFT; +#endif + } + } + if (video_config.mode == VIDEO_MODE_SDL2ACCEL) + { + if (renderer_sdl2::init(machine())) + { + video_config.mode = VIDEO_MODE_SOFT; + } + } if (video_config.mode == VIDEO_MODE_SOFT) { - if (m_renderer->init(machine())) + if (renderer_sdl1::init(machine())) + { return false; + } } /* We may want to set a number of the hints SDL2 provides. @@ -327,9 +357,6 @@ void sdl_osd_interface::window_exit() sdlwindow_sync(); } - // kill the drawers - delete render_module; - execute_async_wait(&sdlwindow_exit_wt, wp_dummy); if (multithreading_enabled) @@ -514,7 +541,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) window->m_windowed_dim = window->get_size(); } - global_free(window->m_renderer); + delete window->m_renderer; window->m_renderer = nullptr; bool is_osx = false; @@ -531,9 +558,7 @@ OSDWORK_CALLBACK( sdl_window_info::sdlwindow_toggle_full_screen_wt ) SDL_DestroyWindow(window->sdl_window()); sdlinput_release_keys(); - osd_renderer *renderer = osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this)); - renderer->init(window->machine()); - window->set_renderer(renderer); + window->set_renderer(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(window))); // toggle the window mode window->set_fullscreen(!window->fullscreen()); @@ -659,8 +684,7 @@ int sdl_window_info::window_init() *last_window_ptr = this; last_window_ptr = &this->m_next; - osd_renderer* renderer = - set_renderer(draw.create(this)); + set_renderer(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this))); // create an event that we can use to skip blitting m_rendered_event = osd_event_alloc(FALSE, TRUE); diff --git a/src/osd/windows/video.cpp b/src/osd/windows/video.cpp index 44106621816..6406221a471 100644 --- a/src/osd/windows/video.cpp +++ b/src/osd/windows/video.cpp @@ -83,28 +83,6 @@ bool windows_osd_interface::video_init() win_window_info::create(machine(), index, osd_monitor_info::pick_monitor(options, index), &windows[index]); } - m_sliders = nullptr; - slider_state *curr = m_sliders; - for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) - { - slider_state *window_sliders = info->m_renderer->get_slider_list(); - if (window_sliders != nullptr) - { - if (m_sliders == nullptr) - { - m_sliders = curr = window_sliders; - } - else - { - while (curr->next != nullptr) - { - curr = curr->next; - } - curr->next = window_sliders; - } - } - } - if (video_config.mode != VIDEO_MODE_NONE) SetForegroundWindow(win_window_list->m_hwnd); @@ -215,6 +193,8 @@ void windows_osd_interface::update(bool skip_redraw) // ping the watchdog on each update winmain_watchdog_ping(); + update_slider_list(); + // if we're not skipping this redraw, update all windows if (!skip_redraw) { diff --git a/src/osd/windows/window.cpp b/src/osd/windows/window.cpp index 5a5520fc328..4dcb871c079 100644 --- a/src/osd/windows/window.cpp +++ b/src/osd/windows/window.cpp @@ -28,6 +28,14 @@ #include "winutil.h" +#include "modules/render/drawbgfx.h" +#include "modules/render/drawnone.h" +#include "modules/render/drawd3d.h" +#include "modules/render/drawgdi.h" +#if (USE_OPENGL) +#include "modules/render/drawogl.h" +#endif + //============================================================ // PARAMETERS //============================================================ @@ -196,13 +204,108 @@ bool windows_osd_interface::window_init() window_threadid = main_threadid; } + const int fallbacks[VIDEO_MODE_COUNT] = { + -1, // NONE -> no fallback + VIDEO_MODE_NONE, // GDI -> NONE + VIDEO_MODE_D3D, // BGFX -> D3D +#if (USE_OPENGL) + VIDEO_MODE_GDI, // OPENGL -> GDI +#endif + -1, // No SDL2ACCEL on Windows OSD +#if (USE_OPENGL) + VIDEO_MODE_OPENGL, // D3D -> OPENGL +#else + VIDEO_MODE_GDI, // D3D -> GDI +#endif + -1 // No SOFT on Windows OSD + }; + + int current_mode = video_config.mode; + while (current_mode != VIDEO_MODE_NONE) + { + bool error = false; + switch(current_mode) + { + case VIDEO_MODE_NONE: + error = renderer_none::init(machine()); + break; + case VIDEO_MODE_GDI: + error = renderer_gdi::init(machine()); + break; + case VIDEO_MODE_BGFX: + error = renderer_bgfx::init(machine()); + break; +#if (USE_OPENGL) + case VIDEO_MODE_OPENGL: + error = renderer_ogl::init(machine()); + break; +#endif + case VIDEO_MODE_SDL2ACCEL: + fatalerror("SDL2-Accel renderer unavailable on Windows OSD."); + break; + case VIDEO_MODE_D3D: + error = renderer_d3d9::init(machine()); + break; + case VIDEO_MODE_SOFT: + fatalerror("SDL1 renderer unavailable on Windows OSD."); + break; + default: + fatalerror("Unknown video mode."); + break; + } + if (error) + { + current_mode = fallbacks[current_mode]; + } + else + { + break; + } + } + video_config.mode = current_mode; + // set up the window list last_window_ptr = &win_window_list; return true; } +void windows_osd_interface::update_slider_list() +{ + for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) + { + if (window->m_renderer->sliders_dirty()) + { + build_slider_list(); + return; + } + } +} +void windows_osd_interface::build_slider_list() +{ + m_sliders = nullptr; + slider_state *curr = m_sliders; + for (win_window_info *info = win_window_list; info != nullptr; info = info->m_next) + { + slider_state *window_sliders = info->m_renderer->get_slider_list(); + if (window_sliders != nullptr) + { + if (m_sliders == nullptr) + { + m_sliders = curr = window_sliders; + } + else + { + while (curr->next != nullptr) + { + curr = curr->next; + } + curr->next = window_sliders; + } + } + } +} //============================================================ // winwindow_exit @@ -300,9 +403,7 @@ void winwindow_process_events_periodic(running_machine &machine) static BOOL is_mame_window(HWND hwnd) { - win_window_info *window; - - for (window = win_window_list; window != nullptr; window = window->m_next) + for (win_window_info *window = win_window_list; window != nullptr; window = window->m_next) if (window->m_hwnd == hwnd) return TRUE; @@ -609,13 +710,10 @@ void win_window_info::create(running_machine &machine, int index, osd_monitor_in // allocate a new window object win_window_info *window = global_alloc(win_window_info(machine)); - //printf("%d, %d\n", config->width, config->height); window->m_win_config = *config; window->m_monitor = monitor; window->m_fullscreen = !video_config.windowed; window->m_index = index; - window->m_renderer = reinterpret_cast(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(window))); - window->m_renderer->init(machine); // set main window if (index > 0) @@ -1019,8 +1117,6 @@ int win_window_info::wnd_extra_height() return rect_height(&temprect) - 100; } - - //============================================================ // thread_entry // (window thread) @@ -1185,8 +1281,14 @@ int win_window_info::complete_create() if (!m_fullscreen || m_fullscreen_safe) { // finish off by trying to initialize DirectX; if we fail, ignore it + if (m_renderer != nullptr) + { + global_free(m_renderer); + } + m_renderer = osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this)); if (m_renderer->create()) return 1; + ShowWindow(m_hwnd, SW_SHOW); } @@ -1892,9 +1994,12 @@ void win_window_info::set_fullscreen(int fullscreen) { if (video_config.mode != VIDEO_MODE_NONE) ShowWindow(m_hwnd, SW_SHOW); - osd_renderer *renderer = reinterpret_cast(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this))); - renderer->init(machine()); - m_renderer = renderer; + + if (m_renderer != nullptr) + { + delete m_renderer; + } + m_renderer = reinterpret_cast(osd_renderer::make_for_type(video_config.mode, reinterpret_cast(this))); if (m_renderer->create()) exit(1); } diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index 239690d2945..7ca02a92844 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -275,8 +275,11 @@ public: private: virtual void osd_exit() override; - windows_options &m_options; - slider_state *m_sliders; + void build_slider_list(); + void update_slider_list(); + + windows_options & m_options; + slider_state * m_sliders; static const int DEFAULT_FONT_HEIGHT = 200; };