summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--hlsl/bloom.fx14
-rw-r--r--hlsl/downsample.fx7
-rw-r--r--hlsl/focus.fx43
-rw-r--r--hlsl/phosphor.fx17
-rw-r--r--hlsl/post.fx12
-rw-r--r--hlsl/primary.fx14
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.c64
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.h3
-rw-r--r--src/osd/modules/render/drawd3d.c4
9 files changed, 88 insertions, 90 deletions
diff --git a/hlsl/bloom.fx b/hlsl/bloom.fx
index 9ed97bbd936..e41a663b204 100644
--- a/hlsl/bloom.fx
+++ b/hlsl/bloom.fx
@@ -186,27 +186,27 @@ uniform float4 Level67Size;
uniform float4 Level89Size;
uniform float2 LevelASize;
-uniform bool PrepareVector = false;
-
VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
- Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= 0.5f;
- Output.Position.xy *= 2.0f;
+ Output.Position.y = 1.0f - Output.Position.y; // flip y
+ Output.Position.xy -= 0.5f; // center
+ Output.Position.xy *= 2.0f; // zoom
Output.Color = Input.Color;
float2 TexCoord = Input.Position.xy / ScreenDims;
- Output.TexCoord01 = TexCoord.xyxy + Prescale.xyxy / Level01Size;
+
+ Output.TexCoord01.xy = TexCoord.xy;
+ Output.TexCoord01.zw = TexCoord.xy + Prescale.xy / Level01Size.zw;
Output.TexCoord23 = TexCoord.xyxy + Prescale.xyxy / Level23Size;
Output.TexCoord45 = TexCoord.xyxy + Prescale.xyxy / Level45Size;
Output.TexCoord67 = TexCoord.xyxy + Prescale.xyxy / Level67Size;
Output.TexCoord89 = TexCoord.xyxy + Prescale.xyxy / Level89Size;
- Output.TexCoordA = TexCoord.xy + Prescale.xy / LevelASize;
+ Output.TexCoordA = TexCoord.xy + Prescale.xy / LevelASize;
return Output;
}
diff --git a/hlsl/downsample.fx b/hlsl/downsample.fx
index 18eaa8313c0..376e4b8802d 100644
--- a/hlsl/downsample.fx
+++ b/hlsl/downsample.fx
@@ -60,13 +60,14 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
- Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= 0.5f;
- Output.Position.xy *= 2.0f;
+ Output.Position.y = 1.0f - Output.Position.y; // flip y
+ Output.Position.xy -= 0.5f; // center
+ Output.Position.xy *= 2.0f; // zoom
Output.Color = Input.Color;
float2 TexCoord = Input.Position.xy / ScreenDims;
+
Output.TexCoord01.xy = TexCoord + float2(-0.5f, -0.5f) * TargetTexelSize * Prescale;
Output.TexCoord01.zw = TexCoord + float2( 0.5f, -0.5f) * TargetTexelSize * Prescale;
Output.TexCoord23.xy = TexCoord + float2(-0.5f, 0.5f) * TargetTexelSize * Prescale;
diff --git a/hlsl/focus.fx b/hlsl/focus.fx
index a7c6c7ae8f2..b71bc0dcdc6 100644
--- a/hlsl/focus.fx
+++ b/hlsl/focus.fx
@@ -40,7 +40,6 @@ struct VS_INPUT
float3 Position : POSITION;
float4 Color : COLOR0;
float2 TexCoord : TEXCOORD0;
- float2 Unused : TEXCOORD1;
};
struct PS_INPUT
@@ -61,12 +60,10 @@ struct PS_INPUT
//-----------------------------------------------------------------------------
uniform float2 ScreenDims;
+uniform float2 TargetDims;
uniform float2 Defocus = float2(0.0f, 0.0f);
-uniform float2 Prescale = float2(8.0f, 8.0f);
-
-float2 Coord0Offset = float2( 0.0f, 0.0f);
float2 Coord1Offset = float2(-0.2f, -0.6f);
float2 Coord2Offset = float2( 0.4f, -0.4f);
float2 Coord3Offset = float2( 0.6f, 0.2f);
@@ -79,28 +76,24 @@ VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
- float2 ScreenTexelDims = 1.0f / ScreenDims;
+ float2 TargetTexelDims = 1.0f / TargetDims;
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
- Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= 0.5f;
- Output.Position.xy *= 2.0f;
-
- // todo: there is an offset which can be noticed at lower prescale in high-resolution
- float2 FocusPrescaleOffset = ScreenTexelDims / Prescale;
+ Output.Position.y = 1.0f - Output.Position.y; // flip y
+ Output.Position.xy -= 0.5f; // center
+ Output.Position.xy *= 2.0f; // zoom
- float2 TexCoord = Input.TexCoord;
- TexCoord += FocusPrescaleOffset;
-
- Output.TexCoord0 = TexCoord + Coord0Offset * ScreenTexelDims * Defocus;
- Output.TexCoord1 = TexCoord + Coord1Offset * ScreenTexelDims * Defocus;
- Output.TexCoord2 = TexCoord + Coord2Offset * ScreenTexelDims * Defocus;
- Output.TexCoord3 = TexCoord + Coord3Offset * ScreenTexelDims * Defocus;
- Output.TexCoord4 = TexCoord + Coord4Offset * ScreenTexelDims * Defocus;
- Output.TexCoord5 = TexCoord + Coord5Offset * ScreenTexelDims * Defocus;
- Output.TexCoord6 = TexCoord + Coord6Offset * ScreenTexelDims * Defocus;
- Output.TexCoord7 = TexCoord + Coord7Offset * ScreenTexelDims * Defocus;
+ float2 TexCoord = Input.TexCoord + 0.5f / TargetDims;
+
+ Output.TexCoord0 = TexCoord;
+ Output.TexCoord1 = TexCoord + Coord1Offset * TargetTexelDims * Defocus;
+ Output.TexCoord2 = TexCoord + Coord2Offset * TargetTexelDims * Defocus;
+ Output.TexCoord3 = TexCoord + Coord3Offset * TargetTexelDims * Defocus;
+ Output.TexCoord4 = TexCoord + Coord4Offset * TargetTexelDims * Defocus;
+ Output.TexCoord5 = TexCoord + Coord5Offset * TargetTexelDims * Defocus;
+ Output.TexCoord6 = TexCoord + Coord6Offset * TargetTexelDims * Defocus;
+ Output.TexCoord7 = TexCoord + Coord7Offset * TargetTexelDims * Defocus;
Output.Color = Input.Color;
@@ -123,13 +116,9 @@ float4 ps_main(PS_INPUT Input) : COLOR
float3 d7 = tex2D(DiffuseSampler, Input.TexCoord7).rgb;
float3 blurred = (d0.rgb + d1 + d2 + d3 + d4 + d5 + d6 + d7) / 8.0f;
-
blurred = lerp(d0.rgb, blurred, 1.0f);
+
return float4(blurred, d0.a);
-
- // float4 texel = tex2D(DiffuseSampler, Input.TexCoord0);
-
- // return float4(texel.rgb, 1.0f);
}
//-----------------------------------------------------------------------------
diff --git a/hlsl/phosphor.fx b/hlsl/phosphor.fx
index 85647fb83e9..44b00ac0ee7 100644
--- a/hlsl/phosphor.fx
+++ b/hlsl/phosphor.fx
@@ -47,7 +47,6 @@ struct VS_INPUT
float3 Position : POSITION;
float4 Color : COLOR0;
float2 TexCoord : TEXCOORD0;
- float2 Unused : TEXCOORD1;
};
struct PS_INPUT
@@ -62,10 +61,9 @@ struct PS_INPUT
//-----------------------------------------------------------------------------
uniform float2 ScreenDims;
-
uniform float2 TargetDims;
-uniform float Passthrough;
+uniform bool Passthrough;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@@ -73,13 +71,14 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
- Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= 0.5f;
- Output.Position *= float4(2.0f, 2.0f, 1.0f, 1.0f);
- Output.Color = Input.Color;
+ Output.Position.y = 1.0f - Output.Position.y; // flip y
+ Output.Position.xy -= 0.5f; // center
+ Output.Position.xy *= 2.0f; // zoom
Output.TexCoord = Input.TexCoord + 0.5f / TargetDims;
Output.PrevCoord = Output.TexCoord;
+
+ Output.Color = Input.Color;
return Output;
}
@@ -99,7 +98,9 @@ float4 ps_main(PS_INPUT Input) : COLOR
float GreenMax = max(CurrPix.g, PrevPix.g);
float BlueMax = max(CurrPix.b, PrevPix.b);
- return lerp(float4(RedMax, GreenMax, BlueMax, CurrPix.a), CurrPix, Passthrough);
+ return Passthrough
+ ? CurrPix
+ : float4(RedMax, GreenMax, BlueMax, CurrPix.a);
}
//-----------------------------------------------------------------------------
diff --git a/hlsl/post.fx b/hlsl/post.fx
index b9a75fd5fa6..57cf821071f 100644
--- a/hlsl/post.fx
+++ b/hlsl/post.fx
@@ -88,10 +88,6 @@ VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
- float4 Position = Input.Position;
- Position.xy *= (ScreenDims + 1.0f) / ScreenDims;
- Position.xy -= 0.5f / ScreenDims;
-
float2 shadowUVOffset = ShadowUVOffset;
shadowUVOffset = xor(OrientationSwapXY, RotationSwapXY)
? shadowUVOffset.yx
@@ -101,16 +97,18 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float2 ScreenCoordPrescaleOffset = 0.0f;
ScreenCoordPrescaleOffset += shadowUVOffset;
- Output.ScreenCoord = Position.xy;
+ Output.ScreenCoord = Input.Position.xy;
Output.ScreenCoord += ScreenCoordPrescaleOffset;
- Output.Position = float4(Position.xyz, 1.0f);
+ Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
Output.Position.y = 1.0f - Output.Position.y; // flip y
Output.Position.xy -= 0.5f; // center
Output.Position.xy *= 2.0f; // zoom
- Output.TexCoord = PrepareVector ? (Input.Position.xy / ScreenDims) : Input.TexCoord;
+ Output.TexCoord = PrepareVector
+ ? Input.Position.xy / ScreenDims
+ : Input.TexCoord; // + 0.5f / TargetDims;
Output.Color = Input.Color;
diff --git a/hlsl/primary.fx b/hlsl/primary.fx
index ed73750185d..da9abf028be 100644
--- a/hlsl/primary.fx
+++ b/hlsl/primary.fx
@@ -33,7 +33,6 @@ struct VS_INPUT
float3 Position : POSITION;
float4 Color : COLOR0;
float2 TexCoord : TEXCOORD0;
- float2 Unused : TEXCOORD1;
};
struct PS_INPUT
@@ -47,6 +46,7 @@ struct PS_INPUT
//-----------------------------------------------------------------------------
uniform float2 ScreenDims;
+
uniform bool PostPass;
uniform float Brighten;
@@ -56,11 +56,13 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.xy /= ScreenDims;
- Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= 0.5f;
- Output.Position.xy *= 2.0f;
+ Output.Position.y = 1.0f - Output.Position.y; // flip y
+ Output.Position.xy -= 0.5f; // center
+ Output.Position.xy *= 2.0f; // zoom
- Output.TexCoord = PostPass ? (Input.Position.xy / ScreenDims) : Input.TexCoord;
+ Output.TexCoord = PostPass
+ ? Input.Position.xy / ScreenDims
+ : Input.TexCoord;
Output.Color = Input.Color;
@@ -87,6 +89,8 @@ technique TestTechnique
{
Lighting = FALSE;
+ Sampler[0] = <DiffuseSampler>;
+
VertexShader = compile vs_2_0 vs_main();
PixelShader = compile ps_2_0 ps_main();
}
diff --git a/src/osd/modules/render/d3d/d3dhlsl.c b/src/osd/modules/render/d3d/d3dhlsl.c
index db1448c6552..4fd6403fb15 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.c
+++ b/src/osd/modules/render/d3d/d3dhlsl.c
@@ -1066,11 +1066,12 @@ int shaders::create_resources(bool reset)
deconverge_effect->add_uniform("RadialConvergeY", uniform::UT_VEC3, uniform::CU_CONVERGE_RADIAL_Y);
focus_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS);
+ focus_effect->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_DIMS);
focus_effect->add_uniform("Defocus", uniform::UT_VEC2, uniform::CU_FOCUS_SIZE);
phosphor_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS);
+ phosphor_effect->add_uniform("TargetDims", uniform::UT_VEC2, uniform::CU_TARGET_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);
downsample_effect->add_uniform("ScreenDims", uniform::UT_VEC2, uniform::CU_SCREEN_DIMS);
@@ -1386,23 +1387,13 @@ int shaders::defocus_pass(render_target *rt, int source_index, poly_info *poly,
return next_index;
}
- 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->prescale_texture[next_index]);
- curr_effect->set_vector("Prescale", 2, prescale);
next_index = rt->next_index(next_index);
blit(rt->prescale_target[next_index], true, D3DPT_TRIANGLELIST, 0, 2);
- // Defocus pass 2
- curr_effect->set_texture("Diffuse", rt->prescale_texture[next_index]);
-
- next_index = rt->next_index(next_index);
- blit(rt->prescale_target[next_index], false, D3DPT_TRIANGLELIST, 0, 2);
-
return next_index;
}
@@ -1410,25 +1401,20 @@ int shaders::phosphor_pass(render_target *rt, cache_target *ct, int source_index
{
int next_index = source_index;
- 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", rt->prescale_texture[next_index]);
curr_effect->set_texture("LastPass", ct->last_texture);
+ curr_effect->set_bool("Passthrough", false);
next_index = rt->next_index(next_index);
blit(rt->prescale_target[next_index], true, D3DPT_TRIANGLELIST, 0, 2);
- phosphor_passthrough = true;
-
// Pass along our phosphor'd screen
curr_effect->update_uniforms();
curr_effect->set_texture("Diffuse", rt->prescale_texture[next_index]);
curr_effect->set_texture("LastPass", rt->prescale_texture[next_index]);
+ curr_effect->set_bool("Passthrough", true);
// Avoid changing targets due to page flipping
blit(ct->last_target, true, D3DPT_TRIANGLELIST, 0, 2);
@@ -1442,7 +1428,8 @@ int shaders::post_pass(render_target *rt, int source_index, poly_info *poly, int
texture_info *texture = poly->get_texture();
- bool prepare_vector = PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable;
+ bool prepare_vector =
+ PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable;
float prescale[2] = {
prepare_vector ? 1.0f : (float)hlsl_prescale_x,
prepare_vector ? 1.0f : (float)hlsl_prescale_y };
@@ -1496,8 +1483,15 @@ int shaders::downsample_pass(render_target *rt, int source_index, poly_info *pol
{
int next_index = source_index;
+ bool prepare_vector =
+ PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable;
+ float prescale[2] = {
+ prepare_vector ? 1.0f : (float)hlsl_prescale_x, // no prescale for vector
+ prepare_vector ? 1.0f : (float)hlsl_prescale_y }; // full prescale for raster
+
curr_effect = downsample_effect;
curr_effect->update_uniforms();
+ 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;
@@ -1529,8 +1523,8 @@ int shaders::bloom_pass(render_target *rt, int source_index, poly_info *poly, in
bool prepare_vector = PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable;
float prescale[2] = {
- prepare_vector ? 1.0f : (float)hlsl_prescale_x / 2.0f,
- prepare_vector ? 1.0f : (float)hlsl_prescale_y / 2.0f }; // no prescale for vector, half prescale for raster
+ prepare_vector ? 1.0f : (float)hlsl_prescale_x / 2.0f, // no prescale for vector
+ prepare_vector ? 1.0f : (float)hlsl_prescale_y / 2.0f }; // half prescale for raster
float bloom_rescale = prepare_vector
? options->vector_bloom_scale
: options->raster_bloom_scale;
@@ -1599,7 +1593,8 @@ int shaders::screen_pass(render_target *rt, int source_index, poly_info *poly, i
curr_effect->set_bool("PostPass", true);
curr_effect->set_float("Brighten", prepare_vector ? 1.0f : 0.0f);
- blit(backbuffer, true, poly->get_type(), vertnum, poly->get_count());
+ // we do not clear the backbuffe here because multiple screens might rendered into
+ blit(backbuffer, false, poly->get_type(), vertnum, poly->get_count());
if (avi_output_file != NULL)
{
@@ -1632,7 +1627,9 @@ void shaders::render_quad(poly_info *poly, int vertnum)
if (PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && curr_texture != NULL)
{
- render_target *rt = find_render_target(curr_texture);
+ curr_render_target = find_render_target(curr_texture);
+
+ render_target *rt = curr_render_target;
if (rt == NULL)
{
return;
@@ -1646,7 +1643,8 @@ void shaders::render_quad(poly_info *poly, int vertnum)
next_index = color_convolution_pass(rt, next_index, poly, vertnum);
next_index = prescale_pass(rt, next_index, poly, vertnum);
next_index = deconverge_pass(rt, next_index, poly, vertnum);
- next_index = defocus_pass(rt, next_index, poly, vertnum);
+ next_index = defocus_pass(rt, next_index, poly, vertnum); // 1st pass
+ next_index = defocus_pass(rt, next_index, poly, vertnum); // 2nd pass
next_index = phosphor_pass(rt, ct, next_index, poly, vertnum);
// create bloom textures
@@ -1669,7 +1667,9 @@ void shaders::render_quad(poly_info *poly, int vertnum)
}
else if (PRIMFLAG_GET_VECTOR(poly->get_flags()) && vector_enable)
{
- render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
+ curr_render_target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
+
+ render_target *rt = curr_render_target;
if (rt == NULL)
{
return;
@@ -1697,7 +1697,9 @@ void shaders::render_quad(poly_info *poly, int vertnum)
}
else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable)
{
- render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
+ curr_render_target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
+
+ render_target *rt = curr_render_target;
if (rt == NULL)
{
return;
@@ -1750,6 +1752,7 @@ void shaders::render_quad(poly_info *poly, int vertnum)
blit(NULL, false, poly->get_type(), vertnum, poly->get_count());
}
+ curr_render_target = NULL;
curr_texture = NULL;
}
@@ -2811,6 +2814,12 @@ void uniform::update()
m_shader->set_vector("SourceRect", 2, &delta.c.x);
break;
}
+ case CU_TARGET_DIMS:
+ {
+ float rtsize[2] = { shadersys->curr_render_target->target_width, shadersys->curr_render_target->target_height };
+ m_shader->set_vector("TargetDims", 2, rtsize);
+ break;
+ }
case CU_NTSC_CCFREQ:
m_shader->set_float("CCValue", options->yiq_cc);
@@ -2885,9 +2894,6 @@ void uniform::update()
case CU_PHOSPHOR_LIFE:
m_shader->set_vector("Phosphor", 3, options->phosphor);
break;
- case CU_PHOSPHOR_IGNORE:
- m_shader->set_float("Passthrough", shadersys->phosphor_passthrough ? 1.0f : 0.0f);
- break;
case CU_POST_REFLECTION:
m_shader->set_float("ReflectionAmount", options->reflection);
diff --git a/src/osd/modules/render/d3d/d3dhlsl.h b/src/osd/modules/render/d3d/d3dhlsl.h
index 5862fb26e5f..01346371310 100644
--- a/src/osd/modules/render/d3d/d3dhlsl.h
+++ b/src/osd/modules/render/d3d/d3dhlsl.h
@@ -44,6 +44,7 @@ public:
CU_SCREEN_DIMS = 0,
CU_SOURCE_DIMS,
CU_SOURCE_RECT,
+ CU_TARGET_DIMS,
CU_NTSC_CCFREQ,
CU_NTSC_A,
@@ -411,7 +412,7 @@ private:
vertex * fsfx_vertices; // pointer to our full-screen-quad object
texture_info * curr_texture;
- bool phosphor_passthrough;
+ render_target * curr_render_target;
public:
render_target * targethead;
diff --git a/src/osd/modules/render/drawd3d.c b/src/osd/modules/render/drawd3d.c
index bcd823be909..caeee46ada9 100644
--- a/src/osd/modules/render/drawd3d.c
+++ b/src/osd/modules/render/drawd3d.c
@@ -2837,9 +2837,7 @@ render_target::~render_target()
//============================================================
bool render_target::init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y)
-{
- D3DFORMAT format = D3DFMT_A8R8G8B8;
-
+{
HRESULT result;
for (int index = 0; index < 2; index++)