From a70198a5fb532f1b5826bcc0a318c1d68291c0c4 Mon Sep 17 00:00:00 2001 From: ImJezze Date: Sun, 3 May 2015 14:41:05 +0200 Subject: HLSL shader improvements - changed shadow mask implementation, shadow count XY now represent the number of pixel the shadow UV sized tiles will take on the screen - implemented rotation of the shadow mask texture depending on the default landscape or portrait view of the screen - removed prescale and pixel border of the shadow mask texture - added option to change the shadow UV offset, to reduce the color bleeding of the shadow mask - adjusted presets to work with the changed mask implementation - reduced defocus offset - improved downsampling for better blurring - improved alignment of bloom layers (raster and vector) - applied bloom effect to the render output of screenshot and AVI recording - changed curvature effect to fit screen size - changed scanlines to be not rendered into bloom layers - changed shadow mask to be not rendered into bloom layers - changed color floor to not light the bloom layers - changed shadow mask to not dark the color floor - added image vignetting simulation and option - added round screen corner simulation and option - added screen light reflection simulation and option - made usage of unused brightness offset (additive) - removed unused pincushion option - removed duplicate shadow count Y options - removed artwork/adapture.png - added artwork/adapture-grill.png - added artwork/shadow-mask.png - added artwork/slot-mask.png - added hlsl/simple.fx - removed unused shaders::blit() function - added shaders::screen_pass() function, which handles the (raster-)rendering on screen, into screenshot and AVI recording - added effect:set_bool() function --- src/osd/modules/render/d3d/d3dcomm.h | 1 + src/osd/modules/render/d3d/d3dhlsl.c | 393 +++++++++++++++++++---------------- src/osd/modules/render/d3d/d3dhlsl.h | 24 ++- src/osd/modules/render/drawd3d.c | 78 ++++--- src/osd/windows/winmain.c | 16 +- src/osd/windows/winmain.h | 12 +- 6 files changed, 301 insertions(+), 223 deletions(-) (limited to 'src') diff --git a/src/osd/modules/render/d3d/d3dcomm.h b/src/osd/modules/render/d3d/d3dcomm.h index dd5e6b5f86c..399df12ad00 100644 --- a/src/osd/modules/render/d3d/d3dcomm.h +++ b/src/osd/modules/render/d3d/d3dcomm.h @@ -149,6 +149,7 @@ public: private: void prescale(); void compute_size(int texwidth, int texheight); + void compute_size_subroutine(int texwidth, int texheight, int* p_width, int* p_height); texture_manager * m_texture_manager; // texture manager pointer diff --git a/src/osd/modules/render/d3d/d3dhlsl.c b/src/osd/modules/render/d3d/d3dhlsl.c index 733ccfe0723..3df21003c17 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.c +++ b/src/osd/modules/render/d3d/d3dhlsl.c @@ -59,8 +59,8 @@ 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.25f, { "adapture-grill.png" }, 6, 6, 0.1875f, 0.1875f, 0.0f, 0.0f, + 0.03f, 0.03f, 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 }, @@ -82,8 +82,8 @@ hlsl_options shaders::s_hlsl_presets[4] = }, { // 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.25f, { "adapture-grill.png" }, 6, 6, 0.1875f, 0.1875f, 0.0f, 0.0f, + 0.03f, 0.03f, 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 }, @@ -105,8 +105,8 @@ hlsl_options shaders::s_hlsl_presets[4] = }, { // 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.25f, { "adapture-grill.png" }, 6, 6, 0.1875f, 0.1875f, 0.0f, 0.0f, + 0.0f, 0.0f, 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 }, @@ -128,8 +128,8 @@ hlsl_options shaders::s_hlsl_presets[4] = }, { // 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, + 0.25f, { "adapture-grill.png" }, 6, 6, 0.1875f, 0.1875f, 0.0f, 0.0f, + 0.15f, 0.15f, 0.15f, 0.15f, 1.0f, 1.0f, 0.5f, 1.0f, 0.0f, 0.5f, { 3.0f, 3.0f }, { 0.5f,-0.33f,0.7f }, @@ -736,8 +736,12 @@ void shaders::init(base *d3dintf, running_machine *machine, d3d::renderer *rende 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->shadow_mask_u_offset = winoptions.screen_shadow_mask_u_offset(); + options->shadow_mask_v_offset = winoptions.screen_shadow_mask_v_offset(); options->curvature = winoptions.screen_curvature(); - options->pincushion = winoptions.screen_pincushion(); + options->round_corner = winoptions.screen_round_corner(); + options->reflection = winoptions.screen_reflection(); + options->vignetting = winoptions.screen_vignetting(); options->scanline_alpha = winoptions.screen_scanline_amount(); options->scanline_scale = winoptions.screen_scanline_scale(); options->scanline_height = winoptions.screen_scanline_height(); @@ -930,14 +934,14 @@ int shaders::create_resources(bool reset) texture.palette = NULL; texture.seqid = 0; - // FIXME: should shadow bitmap really use prescale? - // now create it - shadow_texture = new texture_info(d3d->get_texture_manager(), &texture, video_config.prescale, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)); + // now create it (no prescale, but wrap) + shadow_texture = new texture_info(d3d->get_texture_manager(), &texture, 1, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32) | PRIMFLAG_TEXWRAP_MASK); } const char *fx_dir = downcast(machine->options()).screen_post_fx_dir(); default_effect = new effect(this, d3d->get_device(), "primary.fx", fx_dir); + simple_effect = new effect(this, d3d->get_device(), "simple.fx", fx_dir); post_effect = new effect(this, d3d->get_device(), "post.fx", fx_dir); prescale_effect = new effect(this, d3d->get_device(), "prescale.fx", fx_dir); phosphor_effect = new effect(this, d3d->get_device(), "phosphor.fx", fx_dir); @@ -951,6 +955,7 @@ int shaders::create_resources(bool reset) vector_effect = new effect(this, d3d->get_device(), "vector.fx", fx_dir); if (!default_effect->is_valid()) return 1; + if (!simple_effect->is_valid()) return 1; if (!post_effect->is_valid()) return 1; if (!prescale_effect->is_valid()) return 1; if (!phosphor_effect->is_valid()) return 1; @@ -1017,18 +1022,27 @@ int shaders::create_resources(bool reset) phosphor_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); phosphor_effect->add_uniform("Phosphor", uniform::UT_VEC3, uniform::CU_PHOSPHOR_LIFE); - phosphor_effect->add_uniform("Passthrough", uniform::UT_FLOAT, uniform::CU_PHOSPHOR_IGNORE); + phosphor_effect->add_uniform("Passthrough", uniform::UT_FLOAT, uniform::CU_PHOSPHOR_IGNORE); + + downsample_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); + + bloom_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); + + simple_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); post_effect->add_uniform("SourceDims", uniform::UT_VEC2, uniform::CU_SOURCE_DIMS); post_effect->add_uniform("SourceRect", uniform::UT_VEC2, uniform::CU_SOURCE_RECT); post_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); - post_effect->add_uniform("PincushionAmount", uniform::UT_FLOAT, uniform::CU_POST_PINCUSHION); + post_effect->add_uniform("VignettingAmount", uniform::UT_FLOAT, uniform::CU_POST_VIGNETTING); post_effect->add_uniform("CurvatureAmount", uniform::UT_FLOAT, uniform::CU_POST_CURVATURE); + post_effect->add_uniform("RoundCornerAmount", uniform::UT_FLOAT, uniform::CU_POST_ROUND_CORNER); + post_effect->add_uniform("ReflectionAmount", uniform::UT_FLOAT, uniform::CU_POST_REFLECTION); post_effect->add_uniform("ShadowAlpha", uniform::UT_FLOAT, uniform::CU_POST_SHADOW_ALPHA); post_effect->add_uniform("ShadowCount", uniform::UT_VEC2, uniform::CU_POST_SHADOW_COUNT); post_effect->add_uniform("ShadowUV", uniform::UT_VEC2, uniform::CU_POST_SHADOW_UV); + post_effect->add_uniform("ShadowUVOffset", uniform::UT_VEC2, uniform::CU_POST_SHADOW_UV_OFFSET); post_effect->add_uniform("ShadowDims", uniform::UT_VEC2, uniform::CU_POST_SHADOW_DIMS); post_effect->add_uniform("ScanlineAlpha", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_ALPHA); @@ -1038,6 +1052,10 @@ int shaders::create_resources(bool reset) post_effect->add_uniform("ScanlineBrightOffset", uniform::UT_FLOAT, uniform::CU_POST_SCANLINE_BRIGHT_OFFSET); post_effect->add_uniform("Power", uniform::UT_VEC3, uniform::CU_POST_POWER); post_effect->add_uniform("Floor", uniform::UT_VEC3, uniform::CU_POST_FLOOR); + + vector_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); + + default_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS); initialized = true; @@ -1057,6 +1075,7 @@ void shaders::begin_draw() curr_effect = default_effect; default_effect->set_technique("TestTechnique"); + simple_effect->set_technique("TestTechnique"); post_effect->set_technique("ScanMaskTechnique"); phosphor_effect->set_technique("TestTechnique"); focus_effect->set_technique("TestTechnique"); @@ -1080,49 +1099,6 @@ void shaders::begin_frame() } -//============================================================ -// 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) -{ - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - - curr_effect = default_effect; - - curr_effect->set_texture("Diffuse", src); - - float dst_dims[2] = { (float)dstw, (float)dsth }; - curr_effect->set_vector("ScreenDims", 2, dst_dims); - curr_effect->set_float("PostPass", 1.0f); - curr_effect->set_float("PincushionAmount", options->pincushion); - curr_effect->set_float("Brighten", 0.0f); - - unsigned int num_passes = 0; - curr_effect->begin(&num_passes, 0); - - for (UINT pass = 0; pass < num_passes; pass++) - { - curr_effect->begin_pass(pass); - // add the primitives - HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); - curr_effect->end_pass(); - } - - curr_effect->end(); - - if (new_dst) - { - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, new_dst); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - } -} - - - //============================================================ // shaders::blit //============================================================ @@ -1136,13 +1112,10 @@ void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYP if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); curr_effect = default_effect; + curr_effect->update_uniforms(); curr_effect->set_texture("Diffuse", src); - - vec2f screendims = d3d->get_dims(); - curr_effect->set_vector("ScreenDims", 2, &screendims.c.x); curr_effect->set_float("PostPass", 1.0f); - curr_effect->set_float("PincushionAmount", options->pincushion); curr_effect->set_float("Brighten", 1.0f); unsigned int num_passes = 0; @@ -1433,10 +1406,13 @@ void shaders::defocus_pass(render_target *rt, vec2f &texsize) { UINT num_passes = 0; + float prescale[2] = { (float)hlsl_prescale_x, (float)hlsl_prescale_y }; + // Defocus pass 1 curr_effect = focus_effect; curr_effect->update_uniforms(); curr_effect->set_texture("Diffuse", rt->render_texture[2]); + curr_effect->set_vector("Prescale", 2, prescale); curr_effect->begin(&num_passes, 0); @@ -1481,13 +1457,13 @@ void shaders::phosphor_pass(render_target *rt, cache_target *ct, vec2f &texsize, { UINT num_passes = 0; - curr_effect = phosphor_effect; phosphor_passthrough = false; + + curr_effect = phosphor_effect; curr_effect->update_uniforms(); float rtsize[2] = { rt->target_width, rt->target_height }; curr_effect->set_vector("TargetDims", 2, rtsize); - curr_effect->set_texture("Diffuse", focus_enable ? rt->render_texture[1] : rt->render_texture[2]); curr_effect->set_texture("LastPass", ct->last_texture); @@ -1534,73 +1510,26 @@ void shaders::phosphor_pass(render_target *rt, cache_target *ct, vec2f &texsize, curr_effect->end(); } -void shaders::avi_post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum) +void shaders::post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum, bool prepare_bloom) { UINT num_passes = 0; - curr_effect = post_effect; - curr_effect->update_uniforms(); - curr_effect->set_texture("ShadowTexture", shadow_texture == NULL ? NULL : shadow_texture->get_finaltex()); - - // Scanlines and shadow mask, at high res for AVI logging - if(avi_output_file != NULL) - { - curr_effect->set_texture("DiffuseTexture", rt->render_texture[0]); - - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, avi_final_target); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - - curr_effect->begin(&num_passes, 0); - - for (UINT pass = 0; pass < num_passes; pass++) - { - curr_effect->begin_pass(pass); - // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); - curr_effect->end_pass(); - } - - curr_effect->end(); - } - - if(render_snap) - { - curr_effect->set_texture("DiffuseTexture", rt->render_texture[0]); - - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, snap_target); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); - - curr_effect->begin(&num_passes, 0); - - for (UINT pass = 0; pass < num_passes; pass++) - { - curr_effect->begin_pass(pass); - // add the primitives - result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); - if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); - curr_effect->end_pass(); - } - - curr_effect->end(); - - snap_rendered = true; - } -} - -void shaders::screen_post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum) -{ - UINT num_passes = 0; + float prescale[2] = { (float)hlsl_prescale_x, (float)hlsl_prescale_y }; + bool orientation_swap_xy = (d3d->window().machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY; curr_effect = post_effect; curr_effect->update_uniforms(); curr_effect->set_texture("ShadowTexture", shadow_texture == NULL ? NULL : shadow_texture->get_finaltex()); - curr_effect->set_texture("DiffuseTexture", rt->render_texture[0]); + curr_effect->set_vector("Prescale", 2, prescale); + curr_effect->set_bool("ShadowSwapXY", orientation_swap_xy); + curr_effect->set_bool("PrepareBloom", prepare_bloom); d3d->set_wrap(D3DTADDRESS_MIRROR); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]); + HRESULT result = prepare_bloom + ? (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[3]) // target which is used by bloom effect + : (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]); result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0); if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); @@ -1621,21 +1550,21 @@ void shaders::screen_post_pass(render_target *rt, vec2f &texsize, vec2f &delta, d3d->set_wrap(PRIMFLAG_GET_TEXWRAP(poly->get_texture()->get_flags()) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP); } -void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum) +void shaders::bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum) { UINT num_passes = 0; - curr_effect = downsample_effect; + float prescale[2] = { (float)hlsl_prescale_x, (float)hlsl_prescale_y }; - curr_effect->set_texture("Diffuse", rt->render_texture[2]); + curr_effect = downsample_effect; + curr_effect->update_uniforms(); curr_effect->set_float("BloomRescale", options->raster_bloom_scale); + curr_effect->set_vector("Prescale", 2, prescale); 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; - vec2f screendims = d3d->get_dims(); - curr_effect->set_vector("ScreenSize", 2, &screendims.c.x); float bloom_dims[11][2]; for(; bloom_size >= 2.0f && bloom_index < 11; bloom_size *= 0.5f) { @@ -1645,7 +1574,7 @@ void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, curr_effect->begin(&num_passes, 0); - curr_effect->set_texture("DiffuseTexture", (bloom_index == 0) ? rt->render_texture[2] : rt->bloom_texture[bloom_index - 1]); + curr_effect->set_texture("DiffuseTexture", (bloom_index == 0) ? rt->render_texture[3] : 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) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result); @@ -1670,9 +1599,8 @@ void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, } curr_effect = bloom_effect; + curr_effect->update_uniforms(); - float target_size[2] = { d3d->get_width(), d3d->get_height() }; - curr_effect->set_vector("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 }; @@ -1688,6 +1616,8 @@ void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, curr_effect->set_texture("DiffuseA", rt->render_texture[2]); + curr_effect->set_vector("Prescale", 2, prescale); + char name[9] = "Diffuse*"; for(int index = 1; index < bloom_index; index++) { @@ -1702,8 +1632,10 @@ void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, curr_effect->begin(&num_passes, 0); - HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]); if (result != D3D_OK) osd_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) osd_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result); for (UINT pass = 0; pass < num_passes; pass++) { @@ -1717,6 +1649,72 @@ void shaders::raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, curr_effect->end(); } +void shaders::screen_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum) +{ + UINT num_passes = 0; + + curr_effect = simple_effect; + curr_effect->update_uniforms(); + curr_effect->set_texture("DiffuseTexture", rt->render_texture[1]); + + HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + + curr_effect->begin(&num_passes, 0); + + for (UINT pass = 0; pass < num_passes; pass++) + { + curr_effect->begin_pass(pass); + // add the primitives + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + curr_effect->end_pass(); + } + + curr_effect->end(); + + // Scanlines and shadow mask, at high res for AVI logging + if(avi_output_file != NULL) + { + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, avi_final_target); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + + curr_effect->begin(&num_passes, 0); + + for (UINT pass = 0; pass < num_passes; pass++) + { + curr_effect->begin_pass(pass); + // add the primitives + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + curr_effect->end_pass(); + } + + curr_effect->end(); + } + + if(render_snap) + { + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, snap_target); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); + + curr_effect->begin(&num_passes, 0); + + for (UINT pass = 0; pass < num_passes; pass++) + { + curr_effect->begin_pass(pass); + // add the primitives + result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count()); + if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result); + curr_effect->end_pass(); + } + + curr_effect->end(); + + snap_rendered = true; + } +} + //============================================================ // shaders::render_quad //============================================================ @@ -1754,9 +1752,10 @@ void shaders::render_quad(poly_info *poly, int vertnum) defocus_pass(rt, texsize); } phosphor_pass(rt, ct, texsize, focus_enable); - avi_post_pass(rt, texsize, delta, sourcedims, poly, vertnum); - screen_post_pass(rt, texsize, delta, sourcedims, poly, vertnum); - raster_bloom_pass(rt, texsize, delta, poly, vertnum); + post_pass(rt, texsize, delta, sourcedims, poly, vertnum, true); + post_pass(rt, texsize, delta, sourcedims, poly, vertnum, false); + bloom_pass(rt, texsize, delta, poly, vertnum); + screen_pass(rt, texsize, delta, poly, vertnum); curr_texture->increment_frame_count(); curr_texture->mask_frame_count(options->yiq_phase_count); @@ -1775,12 +1774,7 @@ void shaders::render_quad(poly_info *poly, int vertnum) lines_pending = true; curr_effect = vector_effect; - - if(options->params_dirty) - { - vec2f screendims = d3d->get_dims(); - curr_effect->set_vector("ScreenDims", 2, &screendims.c.x); - } + curr_effect->update_uniforms(); float time_params[2] = { 0.0f, 0.0f }; float length_params[3] = { poly->get_line_length(), options->vector_length_scale, options->vector_length_ratio }; @@ -1802,29 +1796,33 @@ void shaders::render_quad(poly_info *poly, int vertnum) } curr_effect->end(); + result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); if (result != D3D_OK) osd_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result); curr_effect = default_effect; - + curr_effect->update_uniforms(); + curr_effect->set_float("FixedAlpha", 1.0f); } else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable) { render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0); + if (rt == NULL) + { + return; + } - /* Bloom */ + /* Bloom, todo: merge with bloom_pass() */ curr_effect = downsample_effect; - - curr_effect->set_texture("Diffuse", rt->render_texture[0]); + curr_effect->update_uniforms(); curr_effect->set_float("BloomRescale", options->vector_bloom_scale); + curr_effect->set_bool("PrepareVector", true); 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 screen_size[2] = { d3d->get_width(), d3d->get_height() }; - curr_effect->set_vector("ScreenSize", 2, screen_size); float bloom_dims[11][2]; for(; bloom_size >= 2.0f && bloom_index < 11; bloom_size *= 0.5f) { @@ -1859,15 +1857,11 @@ void shaders::render_quad(poly_info *poly, int vertnum) // Bloom composite pass curr_effect = bloom_effect; + curr_effect->update_uniforms(); - float target_size[2] = { d3d->get_width(), d3d->get_height() }; - curr_effect->set_vector("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 }; + 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 }; curr_effect->set_vector("Level0123Weight", 4, weight0123); curr_effect->set_vector("Level4567Weight", 4, weight4567); curr_effect->set_vector("Level89AWeight", 3, weight89A); @@ -1880,6 +1874,8 @@ void shaders::render_quad(poly_info *poly, int vertnum) curr_effect->set_texture("DiffuseA", rt->render_texture[0]); + curr_effect->set_bool("PrepareVector", true); + char name[9] = "Diffuse*"; for(int index = 1; index < bloom_index; index++) { @@ -1910,19 +1906,14 @@ void shaders::render_quad(poly_info *poly, int vertnum) curr_effect->end(); - /* Phosphor */ + /* Phosphor, todo: merge with phosphor_pass() */ + phosphor_passthrough = false; + curr_effect = phosphor_effect; - - if(options->params_dirty) - { - vec2f screendims = d3d->get_dims(); - curr_effect->set_vector("ScreenDims", 2, &screendims.c.x); - curr_effect->set_vector("Phosphor", 3, options->phosphor); - } + curr_effect->update_uniforms(); + float target_dims[2] = { d3d->get_width(), d3d->get_height() }; curr_effect->set_vector("TargetDims", 2, target_dims); - curr_effect->set_float("Passthrough", 0.0f); - curr_effect->set_texture("Diffuse", rt->render_texture[1]); curr_effect->set_texture("LastPass", rt->render_texture[2]); @@ -1959,9 +1950,8 @@ void shaders::render_quad(poly_info *poly, int vertnum) else { curr_effect = default_effect; - - vec2f screendims = d3d->get_dims(); - curr_effect->set_vector("ScreenDims", 2, &screendims.c.x); + curr_effect->update_uniforms(); + curr_effect->set_float("PostPass", 0.0f); curr_effect->begin(&num_passes, 0); @@ -2170,8 +2160,8 @@ bool shaders::register_texture(texture_info *texture) enumerate_screens(); - int hlsl_prescale_x = prescale_force_x; - int hlsl_prescale_y = prescale_force_y; + hlsl_prescale_x = prescale_force_x; + hlsl_prescale_y = prescale_force_y; // Find the nearest prescale factor that is over our screen size if (hlsl_prescale_x == 0) @@ -2252,6 +2242,11 @@ void shaders::delete_resources(bool reset) delete default_effect; default_effect = NULL; } + if (simple_effect != NULL) + { + delete simple_effect; + simple_effect = NULL; + } if (post_effect != NULL) { delete post_effect; @@ -2436,16 +2431,40 @@ static INT32 slider_shadow_mask_vsize(running_machine &machine, void *arg, std:: return slider_set(&(((hlsl_options*)arg)->shadow_mask_v_size), 1.0f / 32.0f, "%2.5f", str, newval); } +static INT32 slider_shadow_mask_uoffset(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->shadow_mask_u_offset), 0.01f, "%2.2f", str, newval); +} + +static INT32 slider_shadow_mask_voffset(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->shadow_mask_v_offset), 0.01f, "%2.2f", str, newval); +} + static INT32 slider_curvature(running_machine &machine, void *arg, std::string *str, INT32 newval) { ((hlsl_options*)arg)->params_dirty = true; return slider_set(&(((hlsl_options*)arg)->curvature), 0.01f, "%2.2f", str, newval); } -static INT32 slider_pincushion(running_machine &machine, void *arg, std::string *str, INT32 newval) +static INT32 slider_round_corner(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->round_corner), 0.01f, "%2.2f", str, newval); +} + +static INT32 slider_reflection(running_machine &machine, void *arg, std::string *str, INT32 newval) { ((hlsl_options*)arg)->params_dirty = true; - return slider_set(&(((hlsl_options*)arg)->pincushion), 0.01f, "%2.2f", str, newval); + return slider_set(&(((hlsl_options*)arg)->reflection), 0.01f, "%2.2f", str, newval); +} + +static INT32 slider_vignetting(running_machine &machine, void *arg, std::string *str, INT32 newval) +{ + ((hlsl_options*)arg)->params_dirty = true; + return slider_set(&(((hlsl_options*)arg)->vignetting), 0.01f, "%2.2f", str, newval); } static INT32 slider_scanline_alpha(running_machine &machine, void *arg, std::string *str, INT32 newval) @@ -2815,15 +2834,16 @@ static INT32 slider_bloom_lvl10_scale(running_machine &machine, void *arg, std:: 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 X Count", 1, 6, 1024, 1, slider_shadow_mask_x_count }, + { "Shadow Mask Y Count", 1, 6, 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 }, + { "Shadow Mask Pixel Count Y", 1, 6, 64, 1, slider_shadow_mask_vsize }, + { "Shadow Mask Offset X", -100, 0, 100, 1, slider_shadow_mask_uoffset }, + { "Shadow Mask Offset Y", -100, 0, 100, 1, slider_shadow_mask_voffset }, { "Screen Curvature", 0, 3, 100, 1, slider_curvature }, - { "Image Pincushion", 0, 3, 100, 1, slider_pincushion }, + { "Screen Round Corner", 0, 3, 100, 1, slider_round_corner }, + { "Screen Reflection", 0, 3, 100, 1, slider_reflection }, + { "Image Vignetting", 0, 3, 100, 1, slider_vignetting }, { "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 }, @@ -3062,12 +3082,18 @@ void uniform::update() m_shader->set_float("Passthrough", shadersys->phosphor_passthrough ? 1.0f : 0.0f); break; - case CU_POST_PINCUSHION: - m_shader->set_float("PincushionAmount", options->pincushion); + case CU_POST_REFLECTION: + m_shader->set_float("ReflectionAmount", options->reflection); + break; + case CU_POST_VIGNETTING: + m_shader->set_float("VignettingAmount", options->vignetting); break; case CU_POST_CURVATURE: m_shader->set_float("CurvatureAmount", options->curvature); break; + case CU_POST_ROUND_CORNER: + m_shader->set_float("RoundCornerAmount", options->round_corner); + break; case CU_POST_SHADOW_ALPHA: m_shader->set_float("ShadowAlpha", shadersys->shadow_texture == NULL ? 0.0f : options->shadow_mask_alpha); break; @@ -3083,6 +3109,12 @@ void uniform::update() m_shader->set_vector("ShadowUV", 2, shadowuv); break; } + case CU_POST_SHADOW_UV_OFFSET: + { + float shadowuv[2] = { options->shadow_mask_u_offset, options->shadow_mask_v_offset }; + m_shader->set_vector("ShadowUVOffset", 2, shadowuv); + break; + } case CU_POST_SHADOW_DIMS: { vec2f shadow_dims; @@ -3344,6 +3376,11 @@ void effect::set_int(D3DXHANDLE param, int value) m_effect->SetInt(param, value); } +void effect::set_bool(D3DXHANDLE param, bool value) +{ + m_effect->SetBool(param, value); +} + void effect::set_matrix(D3DXHANDLE param, matrix *matrix) { m_effect->SetMatrix(param, (D3DXMATRIX*)matrix); @@ -3431,7 +3468,7 @@ static file_error open_next(d3d::renderer *d3d, emu_file &file, const char *temp if (end - pos < 3) fatalerror("Something very wrong is going on!!!\n"); - // copy the device name to an astring + // copy the device name to a string std::string snapdevname; snapdevname.assign(snapstr.substr(pos + 3, end - pos - 3)); diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h index b86af5a1bac..afb760669f3 100644 --- a/src/osd/modules/render/d3d/d3dhlsl.h +++ b/src/osd/modules/render/d3d/d3dhlsl.h @@ -74,11 +74,14 @@ public: CU_PHOSPHOR_LIFE, CU_PHOSPHOR_IGNORE, - CU_POST_PINCUSHION, + CU_POST_VIGNETTING, CU_POST_CURVATURE, + CU_POST_ROUND_CORNER, + CU_POST_REFLECTION, CU_POST_SHADOW_ALPHA, CU_POST_SHADOW_COUNT, CU_POST_SHADOW_UV, + CU_POST_SHADOW_UV_OFFSET, CU_POST_SHADOW_DIMS, CU_POST_SCANLINE_ALPHA, CU_POST_SCANLINE_SCALE, @@ -146,6 +149,7 @@ public: void set_vector(D3DXHANDLE param, int count, float *vector); void set_float(D3DXHANDLE param, float value); void set_int(D3DXHANDLE param, int value); + void set_bool(D3DXHANDLE param, bool value); void set_matrix(D3DXHANDLE param, matrix *matrix); void set_texture(D3DXHANDLE param, texture *tex); @@ -184,8 +188,12 @@ struct hlsl_options int shadow_mask_count_y; float shadow_mask_u_size; float shadow_mask_v_size; + float shadow_mask_u_offset; + float shadow_mask_v_offset; float curvature; - float pincushion; + float round_corner; + float reflection; + float vignetting; float scanline_alpha; float scanline_scale; float scanline_height; @@ -306,9 +314,6 @@ public: }; private: - void blit(surface *dst, texture *src, surface *new_dst, - D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count, - int dstw, int dsth); void blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count); void enumerate_screens(); @@ -329,9 +334,9 @@ private: void deconverge_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims); void defocus_pass(render_target *rt, vec2f &texsize); void phosphor_pass(render_target *rt, cache_target *ct, vec2f &texsize, bool focus_enable); - void screen_post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum); - void avi_post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum); - void raster_bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum); + void post_pass(render_target *rt, vec2f &texsize, vec2f &delta, vec2f &sourcedims, poly_info *poly, int vertnum, bool prepare_bloom); + void bloom_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum); + void screen_pass(render_target *rt, vec2f &texsize, vec2f &delta, poly_info *poly, int vertnum); base * d3dintf; // D3D interface @@ -351,6 +356,8 @@ private: int prescale_force_y; // prescale force y int prescale_size_x; // prescale size x int prescale_size_y; // prescale size y + int hlsl_prescale_x; // hlsl prescale x + int hlsl_prescale_y; // hlsl prescale y int preset; // preset, if relevant bitmap_argb32 shadow_bitmap; // shadow mask bitmap for post-processing shader texture_info * shadow_texture; // shadow mask texture for post-processing shader @@ -388,6 +395,7 @@ private: surface * backbuffer; // pointer to our device's backbuffer effect * curr_effect; // pointer to the currently active effect object effect * default_effect; // pointer to the primary-effect object + effect * simple_effect; // pointer to the simple-effect object effect * prescale_effect; // pointer to the prescale-effect object effect * post_effect; // pointer to the post-effect object effect * focus_effect; // pointer to the focus-effect object diff --git a/src/osd/modules/render/drawd3d.c b/src/osd/modules/render/drawd3d.c index 575d0888ea9..93c316c347f 100644 --- a/src/osd/modules/render/drawd3d.c +++ b/src/osd/modules/render/drawd3d.c @@ -1658,14 +1658,14 @@ void renderer::draw_quad(const render_primitive *prim) return; // fill in the vertexes clockwise - vertex[0].x = prim->bounds.x0 - 0.5f; - vertex[0].y = prim->bounds.y0 - 0.5f; - vertex[1].x = prim->bounds.x1 - 0.5f; - vertex[1].y = prim->bounds.y0 - 0.5f; - vertex[2].x = prim->bounds.x0 - 0.5f; - vertex[2].y = prim->bounds.y1 - 0.5f; - vertex[3].x = prim->bounds.x1 - 0.5f; - vertex[3].y = prim->bounds.y1 - 0.5f; + vertex[0].x = prim->bounds.x0; + vertex[0].y = prim->bounds.y0; + vertex[1].x = prim->bounds.x1; + vertex[1].y = prim->bounds.y0; + vertex[2].x = prim->bounds.x0; + vertex[2].y = prim->bounds.y1; + vertex[3].x = prim->bounds.x1; + vertex[3].y = prim->bounds.y1; float width = prim->bounds.x1 - prim->bounds.x0; float height = prim->bounds.y1 - prim->bounds.y0; @@ -1713,9 +1713,11 @@ void renderer::draw_quad(const render_primitive *prim) if (a > 255) a = 255; DWORD color = D3DCOLOR_ARGB(a, r, g, b); - // set the color, Z parameters to standard values + // adjust half pixel X/Y offset, set the color, Z parameters to standard values for (int i = 0; i < 4; i++) { + vertex[i].x -= 0.5f; + vertex[i].y -= 0.5f; vertex[i].z = 0.0f; vertex[i].rhw = 1.0f; vertex[i].color = color; @@ -2080,28 +2082,14 @@ error: //============================================================ -// texture_info::compute_size +// texture_info::compute_size_subroutine //============================================================ -void texture_info::compute_size(int texwidth, int texheight) +void texture_info::compute_size_subroutine(int texwidth, int texheight, int* p_width, int* p_height) { int finalheight = texheight; int finalwidth = texwidth; - // if we're not wrapping, add a 1-2 pixel border on all sides - m_xborderpix = 0; - m_yborderpix = 0; - if (ENABLE_BORDER_PIX && !(m_flags & PRIMFLAG_TEXWRAP_MASK)) - { - // note we need 2 pixels in X for YUY textures - m_xborderpix = (PRIMFLAG_GET_TEXFORMAT(m_flags) == TEXFORMAT_YUY16) ? 2 : 1; - m_yborderpix = 1; - } - - // compute final texture size - finalwidth += 2 * m_xborderpix; - finalheight += 2 * m_yborderpix; - // round width/height up to nearest power of 2 if we need to if (!(m_texture_manager->get_texture_caps() & D3DPTEXTURECAPS_NONPOW2CONDITIONAL)) { @@ -2144,15 +2132,47 @@ void texture_info::compute_size(int texwidth, int texheight) { finalheight *= 2; } + + *p_width = finalwidth; + *p_height = finalheight; +} + +//============================================================ +// texture_info::compute_size +//============================================================ + +void texture_info::compute_size(int texwidth, int texheight) +{ + int finalheight = texheight; + int finalwidth = texwidth; + + m_xborderpix = 0; + m_yborderpix = 0; + + // if we're not wrapping, add a 1-2 pixel border on all sides + if (ENABLE_BORDER_PIX && !(m_flags & PRIMFLAG_TEXWRAP_MASK)) + { + // note we need 2 pixels in X for YUY textures + m_xborderpix = (PRIMFLAG_GET_TEXFORMAT(m_flags) == TEXFORMAT_YUY16) ? 2 : 1; + m_yborderpix = 1; + } + + // compute final texture size + finalwidth += 2 * m_xborderpix; + finalheight += 2 * m_yborderpix; + + compute_size_subroutine(finalwidth, finalheight, &finalwidth, &finalheight); // if we added pixels for the border, and that just barely pushed us over, take it back - if ((finalwidth > m_texture_manager->get_max_texture_width() && finalwidth - 2 * m_xborderpix <= m_texture_manager->get_max_texture_width()) || - (finalheight > m_texture_manager->get_max_texture_height() && finalheight - 2 * m_yborderpix <= m_texture_manager->get_max_texture_height())) + if (finalwidth > m_texture_manager->get_max_texture_width() || finalheight > m_texture_manager->get_max_texture_height()) { - finalwidth -= 2 * m_xborderpix; - finalheight -= 2 * m_yborderpix; + finalheight = texheight; + finalwidth = texwidth; + m_xborderpix = 0; m_yborderpix = 0; + + compute_size_subroutine(finalwidth, finalheight, &finalwidth, &finalheight); } // if we're above the max width/height, do what? diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c index cc6fd4c2dd9..54afff74298 100644 --- a/src/osd/windows/winmain.c +++ b/src/osd/windows/winmain.c @@ -296,13 +296,17 @@ const options_entry windows_options::s_option_entries[] = { WINOPTION_HLSL_SNAP_HEIGHT, "1536", OPTION_STRING, "HLSL upscaled-snapshot height" }, { WINOPTION_SHADOW_MASK_ALPHA";fs_shadwa(0.0-1.0)", "0.0", OPTION_FLOAT, "shadow mask alpha-blend value (1.0 is fully blended, 0.0 is no mask)" }, { WINOPTION_SHADOW_MASK_TEXTURE";fs_shadwt(0.0-1.0)", "aperture.png", OPTION_STRING, "shadow mask texture name" }, - { WINOPTION_SHADOW_MASK_COUNT_X";fs_shadww", "320", OPTION_INTEGER, "shadow mask width, in phosphor dots" }, - { WINOPTION_SHADOW_MASK_COUNT_Y";fs_shadwh", "240", OPTION_INTEGER, "shadow mask height, in phosphor dots" }, - { WINOPTION_SHADOW_MASK_USIZE";fs_shadwu(0.0-1.0)", "0.09375", OPTION_FLOAT, "shadow mask texture size in U direction" }, - { WINOPTION_SHADOW_MASK_VSIZE";fs_shadwv(0.0-1.0)", "0.109375", OPTION_FLOAT, "shadow mask texture size in V direction" }, - { WINOPTION_CURVATURE";fs_curv(0.0-4.0)", "0.03", OPTION_FLOAT, "screen curvature amount" }, + { WINOPTION_SHADOW_MASK_COUNT_X";fs_shadww", "6", OPTION_INTEGER, "shadow mask width, in phosphor dots" }, + { WINOPTION_SHADOW_MASK_COUNT_Y";fs_shadwh", "6", OPTION_INTEGER, "shadow mask height, in phosphor dots" }, + { WINOPTION_SHADOW_MASK_USIZE";fs_shadwu(0.0-1.0)", "0.1875", OPTION_FLOAT, "shadow mask texture size in U direction" }, + { WINOPTION_SHADOW_MASK_VSIZE";fs_shadwv(0.0-1.0)", "0.1875", OPTION_FLOAT, "shadow mask texture size in V direction" }, + { WINOPTION_SHADOW_MASK_UOFFSET";fs_shadwou(-1.0-1.0)", "0.0", OPTION_FLOAT, "shadow mask texture offset in U direction" }, + { WINOPTION_SHADOW_MASK_VOFFSET";fs_shadwov(-1.0-1.0)", "0.0", OPTION_FLOAT, "shadow mask texture offset in V direction" }, + { WINOPTION_CURVATURE";fs_curv(0.0-1.0)", "0.03", OPTION_FLOAT, "screen curvature amount" }, + { WINOPTION_ROUND_CORNER";fs_rndc(0.0-1.0)", "0.03", OPTION_FLOAT, "screen round corner amount" }, + { WINOPTION_REFLECTION";fs_ref(0.0-1.0)", "0.03", OPTION_FLOAT, "screen reflection amount" }, + { WINOPTION_VIGNETTING";fs_vig(0.0-1.0)", "0.03", OPTION_FLOAT, "image vignetting amount" }, /* Beam-related values below this line*/ - { WINOPTION_PINCUSHION";fs_pin(0.0-4.0)", "0.03", OPTION_FLOAT, "pincushion amount" }, { WINOPTION_SCANLINE_AMOUNT";fs_scanam(0.0-4.0)", "1.0", OPTION_FLOAT, "overall alpha scaling value for scanlines" }, { WINOPTION_SCANLINE_SCALE";fs_scansc(0.0-4.0)", "1.0", OPTION_FLOAT, "overall height scaling value for scanlines" }, { WINOPTION_SCANLINE_HEIGHT";fs_scanh(0.0-4.0)", "1.0", OPTION_FLOAT, "individual height scaling value for scanlines" }, diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h index 92e4056973e..3d0e035701d 100644 --- a/src/osd/windows/winmain.h +++ b/src/osd/windows/winmain.h @@ -43,8 +43,12 @@ #define WINOPTION_SHADOW_MASK_COUNT_Y "shadow_mask_y_count" #define WINOPTION_SHADOW_MASK_USIZE "shadow_mask_usize" #define WINOPTION_SHADOW_MASK_VSIZE "shadow_mask_vsize" -#define WINOPTION_PINCUSHION "pincushion" +#define WINOPTION_SHADOW_MASK_UOFFSET "shadow_mask_uoffset" +#define WINOPTION_SHADOW_MASK_VOFFSET "shadow_mask_voffset" +#define WINOPTION_REFLECTION "reflection" #define WINOPTION_CURVATURE "curvature" +#define WINOPTION_ROUND_CORNER "round_corner" +#define WINOPTION_VIGNETTING "vignetting" #define WINOPTION_SCANLINE_AMOUNT "scanline_alpha" #define WINOPTION_SCANLINE_SCALE "scanline_size" #define WINOPTION_SCANLINE_HEIGHT "scanline_height" @@ -140,14 +144,18 @@ public: int screen_shadow_mask_count_y() const { return int_value(WINOPTION_SHADOW_MASK_COUNT_Y); } float screen_shadow_mask_u_size() const { return float_value(WINOPTION_SHADOW_MASK_USIZE); } float screen_shadow_mask_v_size() const { return float_value(WINOPTION_SHADOW_MASK_VSIZE); } + float screen_shadow_mask_u_offset() const { return float_value(WINOPTION_SHADOW_MASK_UOFFSET); } + float screen_shadow_mask_v_offset() const { return float_value(WINOPTION_SHADOW_MASK_VOFFSET); } float screen_scanline_amount() const { return float_value(WINOPTION_SCANLINE_AMOUNT); } float screen_scanline_scale() const { return float_value(WINOPTION_SCANLINE_SCALE); } float screen_scanline_height() const { return float_value(WINOPTION_SCANLINE_HEIGHT); } float screen_scanline_bright_scale() const { return float_value(WINOPTION_SCANLINE_BRIGHT_SCALE); } float screen_scanline_bright_offset() const { return float_value(WINOPTION_SCANLINE_BRIGHT_OFFSET); } float screen_scanline_offset() const { return float_value(WINOPTION_SCANLINE_OFFSET); } - float screen_pincushion() const { return float_value(WINOPTION_PINCUSHION); } + float screen_reflection() const { return float_value(WINOPTION_REFLECTION); } float screen_curvature() const { return float_value(WINOPTION_CURVATURE); } + float screen_round_corner() const { return float_value(WINOPTION_ROUND_CORNER); } + float screen_vignetting() const { return float_value(WINOPTION_VIGNETTING); } const char *screen_defocus() const { return value(WINOPTION_DEFOCUS); } const char *screen_converge_x() const { return value(WINOPTION_CONVERGE_X); } const char *screen_converge_y() const { return value(WINOPTION_CONVERGE_Y); } -- cgit v1.2.3-70-g09d2