summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/d3d/d3dhlsl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/d3d/d3dhlsl.c')
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.c393
1 files changed, 215 insertions, 178 deletions
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<windows_options &>(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");
@@ -1085,49 +1104,6 @@ void shaders::begin_frame()
//============================================================
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
-//============================================================
-
-void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type,
UINT32 prim_index, UINT32 prim_count)
{
HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst);
@@ -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));