summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--hlsl/bloom.fx88
-rw-r--r--hlsl/color.fx10
-rw-r--r--hlsl/deconverge.fx72
-rw-r--r--hlsl/downsample.fx30
-rw-r--r--hlsl/focus.fx2
-rw-r--r--hlsl/phosphor.fx4
-rw-r--r--hlsl/post.fx23
-rw-r--r--hlsl/prescale.fx22
-rw-r--r--hlsl/yiq_decode.fx19
-rw-r--r--hlsl/yiq_encode.fx28
-rw-r--r--src/emu/render.c5
-rw-r--r--src/osd/windows/d3d8intf.c707
-rw-r--r--src/osd/windows/d3d9intf.c255
-rw-r--r--src/osd/windows/d3dcomm.h223
-rw-r--r--src/osd/windows/d3dhlsl.c976
-rw-r--r--src/osd/windows/d3dhlsl.h139
-rw-r--r--src/osd/windows/d3dintf.h171
-rw-r--r--src/osd/windows/drawd3d.c2375
-rw-r--r--src/osd/windows/drawd3d.h246
-rw-r--r--src/osd/windows/windows.mak4
-rw-r--r--src/osd/windows/winmain.c14
-rw-r--r--src/osd/windows/winmain.h24
23 files changed, 2508 insertions, 2930 deletions
diff --git a/.gitattributes b/.gitattributes
index da7f3ec6cb6..d78633d0bad 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8333,7 +8333,6 @@ src/osd/sdl/watchdog.c svneol=native#text/plain
src/osd/sdl/watchdog.h svneol=native#text/plain
src/osd/sdl/window.c svneol=native#text/plain
src/osd/sdl/window.h svneol=native#text/plain
-src/osd/windows/d3d8intf.c svneol=native#text/plain
src/osd/windows/d3d9intf.c svneol=native#text/plain
src/osd/windows/d3dcomm.h svneol=native#text/plain
src/osd/windows/d3dhlsl.c svneol=native#text/plain
diff --git a/hlsl/bloom.fx b/hlsl/bloom.fx
index cf8b603cece..aa856118e1b 100644
--- a/hlsl/bloom.fx
+++ b/hlsl/bloom.fx
@@ -124,7 +124,7 @@ sampler DiffuseSampler9 = sampler_state
AddressW = CLAMP;
};
-sampler DiffuseSampler10 = sampler_state
+sampler DiffuseSamplerA = sampler_state
{
Texture = <DiffuseK>;
MipFilter = LINEAR;
@@ -143,7 +143,12 @@ struct VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR0;
- float2 TexCoord : TEXCOORD0;
+ float4 TexCoord01 : TEXCOORD0;
+ float4 TexCoord23 : TEXCOORD1;
+ float4 TexCoord45 : TEXCOORD2;
+ float4 TexCoord67 : TEXCOORD3;
+ float4 TexCoord89 : TEXCOORD4;
+ float2 TexCoordA : TEXCOORD5;
};
struct VS_INPUT
@@ -156,7 +161,12 @@ struct VS_INPUT
struct PS_INPUT
{
float4 Color : COLOR0;
- float2 TexCoord : TEXCOORD0;
+ float4 TexCoord01 : TEXCOORD0;
+ float4 TexCoord23 : TEXCOORD1;
+ float4 TexCoord45 : TEXCOORD2;
+ float4 TexCoord67 : TEXCOORD3;
+ float4 TexCoord89 : TEXCOORD4;
+ float2 TexCoordA : TEXCOORD5;
};
//-----------------------------------------------------------------------------
@@ -164,18 +174,7 @@ struct PS_INPUT
//-----------------------------------------------------------------------------
uniform float2 TargetSize;
-
-uniform float DiffuseScaleA;
-uniform float DiffuseScaleB;
-uniform float DiffuseScaleC;
-uniform float DiffuseScaleD;
-uniform float DiffuseScaleE;
-uniform float DiffuseScaleF;
-uniform float DiffuseScaleG;
-uniform float DiffuseScaleH;
-uniform float DiffuseScaleI;
-uniform float DiffuseScaleJ;
-uniform float DiffuseScaleK;
+uniform float2 SourceSize;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@@ -188,7 +187,18 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position.xy *= float2(2.0f, 2.0f);
Output.Color = Input.Color;
float2 inversePixel = 1.0f / TargetSize;
- Output.TexCoord = Input.Position.xy * inversePixel;
+ float2 TexCoord = Input.Position.xy * inversePixel + float2(0.5f, 0.5f) * inversePixel;
+ Output.TexCoord01.xy = TexCoord;
+ Output.TexCoord01.zw = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.5f;
+ Output.TexCoord23.xy = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.25f;
+ Output.TexCoord23.zw = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.125f;
+ Output.TexCoord45.xy = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.0625f;
+ Output.TexCoord45.zw = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.03125f;
+ Output.TexCoord67.xy = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.015625f;
+ Output.TexCoord67.zw = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.0078125f;
+ Output.TexCoord89.xy = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.00390625f;
+ Output.TexCoord89.zw = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.001953125f;
+ Output.TexCoordA = ((TexCoord - 0.5f) * 1.00f + 0.5f) * 0.0009765625f;
return Output;
}
@@ -197,21 +207,39 @@ VS_OUTPUT vs_main(VS_INPUT Input)
// Bloom Pixel Shader
//-----------------------------------------------------------------------------
+uniform float4 Level0123Weight;
+uniform float4 Level4567Weight;
+uniform float3 Level89AWeight;
+
float4 ps_main(PS_INPUT Input) : COLOR
{
- float3 texel0 = tex2D(DiffuseSampler0, Input.TexCoord).rgb * DiffuseScaleA * 1.00f;
- float3 texel1 = tex2D(DiffuseSampler1, Input.TexCoord).rgb * DiffuseScaleB * 0.95f;
- float3 texel2 = tex2D(DiffuseSampler2, Input.TexCoord).rgb * DiffuseScaleC * 0.85f;
- float3 texel3 = tex2D(DiffuseSampler3, Input.TexCoord).rgb * DiffuseScaleD * 0.75f;
- float3 texel4 = tex2D(DiffuseSampler4, Input.TexCoord).rgb * DiffuseScaleE * 0.65f;
- float3 texel5 = tex2D(DiffuseSampler5, Input.TexCoord).rgb * DiffuseScaleF * 0.55f;
- float3 texel6 = tex2D(DiffuseSampler6, Input.TexCoord).rgb * DiffuseScaleG * 0.45f;
- float3 texel7 = tex2D(DiffuseSampler7, Input.TexCoord).rgb * DiffuseScaleH * 0.35f;
- float3 texel8 = tex2D(DiffuseSampler8, Input.TexCoord).rgb * DiffuseScaleI * 0.25f;
- float3 texel9 = tex2D(DiffuseSampler9, Input.TexCoord).rgb * DiffuseScaleJ * 0.15f;
- float3 texel10 = tex2D(DiffuseSampler10, Input.TexCoord).rgb * DiffuseScaleK * 0.10f;
- return float4(texel0 + texel1 + texel2 + texel3 + texel4 +
- texel5 + texel6 + texel7 + texel8 + texel9 + texel10, 1.0f);
+ float3 texel0 = tex2D(DiffuseSampler0, Input.TexCoord01.xy).rgb;
+ float3 texel1 = tex2D(DiffuseSampler1, Input.TexCoord01.zw).rgb;
+ float3 texel2 = tex2D(DiffuseSampler2, Input.TexCoord23.xy).rgb;
+ float3 texel3 = tex2D(DiffuseSampler3, Input.TexCoord23.zw).rgb;
+ float3 texel4 = tex2D(DiffuseSampler4, Input.TexCoord45.xy).rgb;
+ float3 texel5 = tex2D(DiffuseSampler5, Input.TexCoord45.zw).rgb;
+ float3 texel6 = tex2D(DiffuseSampler6, Input.TexCoord67.xy).rgb;
+ float3 texel7 = tex2D(DiffuseSampler7, Input.TexCoord67.zw).rgb;
+ float3 texel8 = tex2D(DiffuseSampler8, Input.TexCoord89.xy).rgb;
+ float3 texel9 = tex2D(DiffuseSampler9, Input.TexCoord89.zw).rgb;
+ float3 texelA = tex2D(DiffuseSamplerA, Input.TexCoordA).rgb;
+
+ texel0 = texel0 * Level0123Weight.x; // 1.0f;
+ texel1 = texel1 * Level0123Weight.y; // 0.21f;
+ texel2 = texel2 * Level0123Weight.z; // 0.19f;
+ texel3 = texel3 * Level0123Weight.w; // 0.17f;
+ texel4 = texel4 * Level4567Weight.x; // 0.15f;
+ texel5 = texel5 * Level4567Weight.y; // 0.14f;
+ texel6 = texel6 * Level4567Weight.z; // 0.13f;
+ texel7 = texel7 * Level4567Weight.w; // 0.12f;
+ texel8 = texel8 * Level89AWeight.x; // 0.11f;
+ texel9 = texel9 * Level89AWeight.y; // 0.10f;
+ texelA = texelA * Level89AWeight.z; // 0.09f;
+
+ float4 sum = float4(texel0 + texel1 + texel2 + texel3 + texel4 +
+ texel5 + texel6 + texel7 + texel8 + texel9 + texelA, 1.0f);
+ return sum;
}
//-----------------------------------------------------------------------------
@@ -234,7 +262,7 @@ technique TestTechnique
Sampler[7] = <DiffuseSampler7>; // 16x16
Sampler[8] = <DiffuseSampler8>; // 8x8
Sampler[9] = <DiffuseSampler9>; // 4x4
- Sampler[10] = <DiffuseSampler10>; // 2x2
+ Sampler[10] = <DiffuseSamplerA>; // 2x2
VertexShader = compile vs_3_0 vs_main();
PixelShader = compile ps_3_0 ps_main();
diff --git a/hlsl/color.fx b/hlsl/color.fx
index 5e62dbd6d9f..e22bd17634b 100644
--- a/hlsl/color.fx
+++ b/hlsl/color.fx
@@ -46,11 +46,7 @@ struct PS_INPUT
uniform float TargetWidth;
uniform float TargetHeight;
-uniform float RawWidth;
-uniform float RawHeight;
-
-uniform float WidthRatio;
-uniform float HeightRatio;
+uniform float2 RawDims;
uniform float YIQEnable;
@@ -58,7 +54,7 @@ VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
- float2 invDims = float2(1.0f / RawWidth, 1.0f / RawHeight);
+ float2 invDims = 1.0f / RawDims;
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.x /= TargetWidth;
Output.Position.y /= TargetHeight;
@@ -67,7 +63,7 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position.y -= 0.5f;
Output.Position *= float4(2.0f, 2.0f, 1.0f, 1.0f);
Output.Color = Input.Color;
- Output.TexCoord = Input.TexCoord + float2(0.5f, 0.5f) * invDims;
+ Output.TexCoord = Input.TexCoord + 0.5f * invDims;
return Output;
}
diff --git a/hlsl/deconverge.fx b/hlsl/deconverge.fx
index 7121fe07b46..3943b2666cd 100644
--- a/hlsl/deconverge.fx
+++ b/hlsl/deconverge.fx
@@ -23,6 +23,9 @@ struct VS_OUTPUT
{
float4 Position : POSITION;
float4 Color : COLOR0;
+ //float2 RedCoord : TEXCOORD0;
+ //float2 GrnCoord : TEXCOORD1;
+ //float2 BluCoord : TEXCOORD2;
float3 CoordX : TEXCOORD0;
float3 CoordY : TEXCOORD1;
float2 TexCoord : TEXCOORD2;
@@ -38,6 +41,9 @@ struct VS_INPUT
struct PS_INPUT
{
float4 Color : COLOR0;
+ //float2 RedCoord : TEXCOORD0;
+ //float2 GrnCoord : TEXCOORD1;
+ //float2 BluCoord : TEXCOORD2;
float3 CoordX : TEXCOORD0;
float3 CoordY : TEXCOORD1;
float2 TexCoord : TEXCOORD2;
@@ -53,11 +59,9 @@ uniform float3 ConvergeY = float3(0.0f, 0.0f, 0.0f);
uniform float TargetWidth;
uniform float TargetHeight;
-uniform float RawWidth;
-uniform float RawHeight;
+uniform float2 RawDims;
-uniform float WidthRatio;
-uniform float HeightRatio;
+uniform float2 SizeRatio;
uniform float3 RadialConvergeX = float3(0.0f, 0.0f, 0.0f);
uniform float3 RadialConvergeY = float3(0.0f, 0.0f, 0.0f);
@@ -68,9 +72,8 @@ VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
- float2 TargetRawRatio = float2(TargetWidth / RawWidth, TargetWidth / RawWidth);
- float2 invDims = float2(1.0f / RawWidth, 1.0f / RawHeight);
- float2 Ratios = float2(1.0f / WidthRatio, 1.0f / HeightRatio);
+ float2 invDims = 1.0f / RawDims;
+ float2 Ratios = SizeRatio;
Output.Position = float4(Input.Position.xyz, 1.0f);
Output.Position.x /= TargetWidth;
Output.Position.y /= TargetHeight;
@@ -81,8 +84,19 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Color = Input.Color;
float2 TexCoord = Input.TexCoord;
- Output.CoordX = ((((TexCoord.x / Ratios.x) - 0.5f)) * (1.0f + RadialConvergeX / RawWidth) + 0.5f) * Ratios.x + ConvergeX * invDims.x;
- Output.CoordY = ((((TexCoord.y / Ratios.y) - 0.5f)) * (1.0f + RadialConvergeY / RawHeight) + 0.5f) * Ratios.y + ConvergeY * invDims.y;
+ float2 RadialRed = float2(RadialConvergeX.x, RadialConvergeY.x);
+ float2 RadialGrn = float2(RadialConvergeX.y, RadialConvergeY.y);
+ float2 RadialBlu = float2(RadialConvergeX.z, RadialConvergeY.z);
+ float2 ConvergeRed = float2(ConvergeX.x, ConvergeY.x);
+ float2 ConvergeGrn = float2(ConvergeX.y, ConvergeY.y);
+ float2 ConvergeBlu = float2(ConvergeX.z, ConvergeY.z);
+ float2 ScaledRatio = ((TexCoord * SizeRatio) - 0.5f);
+
+ Output.CoordX = ((((TexCoord.x / Ratios.x) - 0.5f)) * (1.0f + RadialConvergeX / RawDims.x) + 0.5f) * Ratios.x + ConvergeX * invDims.x;
+ Output.CoordY = ((((TexCoord.y / Ratios.y) - 0.5f)) * (1.0f + RadialConvergeY / RawDims.y) + 0.5f) * Ratios.y + ConvergeY * invDims.y;
+ //Output.RedCoord = (ScaledRatio * (1.0f + RadialRed / RawDims) + 0.5f) * SizeRatio + ConvergeRed * invDims;
+ //Output.GrnCoord = (ScaledRatio * (1.0f + RadialGrn / RawDims) + 0.5f) * SizeRatio + ConvergeGrn * invDims;
+ //Output.BluCoord = (ScaledRatio * (1.0f + RadialBlu / RawDims) + 0.5f) * SizeRatio + ConvergeBlu * invDims;
Output.TexCoord = TexCoord;
return Output;
@@ -94,39 +108,15 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float4 ps_main(PS_INPUT Input) : COLOR
{
- float2 MagnetOffset = float2(32.0f / RawWidth, 32.0f / RawHeight);
- float2 MagnetCenter = float2(0.9f / WidthRatio, 0.9f / HeightRatio);
- float MagnetDistance = length((MagnetCenter - Input.TexCoord) * float2(WidthRatio, HeightRatio));
- float Deconverge = 1.0f - MagnetDistance / MagnetCenter;
- Deconverge = 1.0f;//clamp(Deconverge, 0.0f, 1.0f);
- float Alpha = tex2D(DiffuseSampler, Input.TexCoord).a;
+ float Alpha = tex2D(DiffuseSampler, Input.TexCoord).a;
+ //float RedTexel = tex2D(DiffuseSampler, Input.RedCoord).r;
+ //float GrnTexel = tex2D(DiffuseSampler, Input.GrnCoord).g;
+ //float BluTexel = tex2D(DiffuseSampler, Input.BluCoord).b;
+ float RedTexel = tex2D(DiffuseSampler, float2(Input.CoordX.x, Input.CoordY.x)).r;
+ float GrnTexel = tex2D(DiffuseSampler, float2(Input.CoordX.y, Input.CoordY.y)).g;
+ float BluTexel = tex2D(DiffuseSampler, float2(Input.CoordX.z, Input.CoordY.z)).b;
- float2 TargetDims = float2(RawWidth, RawHeight);
- float2 DimOffset = 0.0f / TargetDims;
- float2 TexCoord = Input.TexCoord;
- float3 CoordX = Input.CoordX;
- float3 CoordY = Input.CoordY;
-
- CoordX = lerp(TexCoord.x, CoordX, Deconverge);
- CoordY = lerp(TexCoord.y, CoordY, Deconverge);
-
- float RedTexel = tex2D(DiffuseSampler, float2(CoordX.x, CoordY.x) - DimOffset).r;
- float GrnTexel = tex2D(DiffuseSampler, float2(CoordX.y, CoordY.y) - DimOffset).g;
- float BluTexel = tex2D(DiffuseSampler, float2(CoordX.z, CoordY.z) - DimOffset).b;
-
- //RedTexel *= Input.RedCoord.x < (WidthRatio / RawWidth) ? 0.0f : 1.0f;
- //RedTexel *= Input.RedCoord.y < (HeightRatio / RawHeight) ? 0.0f : 1.0f;
- //RedTexel *= Input.RedCoord.x > (1.0f / WidthRatio + 1.0f / RawWidth) ? 0.0f : 1.0f;
- //RedTexel *= Input.RedCoord.y > (1.0f / HeightRatio + 1.0f / RawHeight) ? 0.0f : 1.0f;
- //GrnTexel *= Input.GrnCoord.x < (WidthRatio / RawWidth) ? 0.0f : 1.0f;
- //GrnTexel *= Input.GrnCoord.y < (HeightRatio / RawHeight) ? 0.0f : 1.0f;
- //GrnTexel *= Input.GrnCoord.x > (1.0f / WidthRatio + 1.0f / RawWidth) ? 0.0f : 1.0f;
- //GrnTexel *= Input.GrnCoord.y > (1.0f / HeightRatio + 1.0f / RawHeight) ? 0.0f : 1.0f;
- //BluTexel *= Input.BluCoord.x < (WidthRatio / RawWidth) ? 0.0f : 1.0f;
- //BluTexel *= Input.BluCoord.y < (HeightRatio / RawHeight) ? 0.0f : 1.0f;
- //BluTexel *= Input.BluCoord.x > (1.0f / WidthRatio + 1.0f / RawWidth) ? 0.0f : 1.0f;
- //BluTexel *= Input.BluCoord.y > (1.0f / HeightRatio + 1.0f / RawHeight) ? 0.0f : 1.0f;
-
+ //return float4(Input.TexCoord, 0.0f, 1.0f);
return float4(RedTexel, GrnTexel, BluTexel, Alpha);
}
diff --git a/hlsl/downsample.fx b/hlsl/downsample.fx
index 5e0de0ca46d..9a77d12d6ac 100644
--- a/hlsl/downsample.fx
+++ b/hlsl/downsample.fx
@@ -54,31 +54,27 @@ struct PS_INPUT
uniform float2 TargetSize;
uniform float2 SourceSize;
-uniform float2 Defocus = float2(0.0f, 0.0f);
-
-uniform float Brighten;
-
VS_OUTPUT vs_main(VS_INPUT Input)
{
VS_OUTPUT Output = (VS_OUTPUT)0;
Output.Position = float4(Input.Position.xyz, 1.0f);
- Output.Position.xy /= TargetSize;
+ Output.Position.xy /= SourceSize;
Output.Position.y = 1.0f - Output.Position.y;
- Output.Position.xy -= float2(0.5f, 0.5f);
- Output.Position.xy *= float2(2.0f, 2.0f);
+ Output.Position.xy -= 0.5f;
+ Output.Position.xy *= 2.0f;
Output.Color = Input.Color;
float2 inversePixel = 1.0f / TargetSize;
- Output.TexCoord01.xy = Input.Position.xy * inversePixel + float2(0.75f - 0.5f, 0.32f - 0.5f) * inversePixel;
- Output.TexCoord01.zw = Input.Position.xy * inversePixel + float2(0.35f - 0.5f, 0.65f - 0.5f) * inversePixel;
- Output.TexCoord23.xy = Input.Position.xy * inversePixel + float2(0.31f - 0.5f, 1.25f - 0.5f) * inversePixel;
- Output.TexCoord23.zw = Input.Position.xy * inversePixel + float2(0.58f - 0.5f, 1.61f - 0.5f) * inversePixel;
- Output.TexCoord45.xy = Input.Position.xy * inversePixel + float2(1.00f - 0.5f, 1.75f - 0.5f) * inversePixel;
- Output.TexCoord45.zw = Input.Position.xy * inversePixel + float2(1.35f - 0.5f, 1.64f - 0.5f) * inversePixel;
- Output.TexCoord67.xy = Input.Position.xy * inversePixel + float2(1.65f - 0.5f, 1.32f - 0.5f) * inversePixel;
- Output.TexCoord67.zw = Input.Position.xy * inversePixel + float2(1.72f - 0.5f, 0.93f - 0.5f) * inversePixel;
- Output.TexCoord89.xy = Input.Position.xy * inversePixel + float2(1.57f - 0.5f, 0.57f - 0.5f) * inversePixel;
- Output.TexCoord89.zw = Input.Position.xy * inversePixel + float2(1.25f - 0.5f, 0.33f - 0.5f) * inversePixel;
+ Output.TexCoord01.xy = Input.Position.xy * inversePixel + float2(0.00f + 0.5f, 0.00f + 0.5f) * inversePixel;
+ Output.TexCoord01.zw = Input.Position.xy * inversePixel + float2(0.50f + 0.5f, 0.00f + 0.5f) * inversePixel;
+ Output.TexCoord23.xy = Input.Position.xy * inversePixel + float2(0.25f + 0.5f, 0.25f + 0.5f) * inversePixel;
+ Output.TexCoord23.zw = Input.Position.xy * inversePixel + float2(0.50f + 0.5f, 0.25f + 0.5f) * inversePixel;
+ Output.TexCoord45.xy = Input.Position.xy * inversePixel + float2(0.75f + 0.5f, 0.25f + 0.5f) * inversePixel;
+ Output.TexCoord45.zw = Input.Position.xy * inversePixel + float2(0.00f + 0.5f, 0.50f + 0.5f) * inversePixel;
+ Output.TexCoord67.xy = Input.Position.xy * inversePixel + float2(0.50f + 0.5f, 0.50f + 0.5f) * inversePixel;
+ Output.TexCoord67.zw = Input.Position.xy * inversePixel + float2(0.00f + 0.5f, 0.75f + 0.5f) * inversePixel;
+ Output.TexCoord89.xy = Input.Position.xy * inversePixel + float2(0.25f + 0.5f, 0.75f + 0.5f) * inversePixel;
+ Output.TexCoord89.zw = Input.Position.xy * inversePixel + float2(0.75f + 0.5f, 0.75f + 0.5f) * inversePixel;
return Output;
}
diff --git a/hlsl/focus.fx b/hlsl/focus.fx
index 37079af55a2..0df9c876b2b 100644
--- a/hlsl/focus.fx
+++ b/hlsl/focus.fx
@@ -86,7 +86,7 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float2 InvTexSize = float2(1.0f / TargetWidth, 1.0f / TargetHeight);
float2 TexCoord = Input.TexCoord;
- TexCoord = TexCoord + 0.5f * InvTexSize;
+ TexCoord = TexCoord;// + float2(0.5f, -0.5f) * InvTexSize;
Output.TexCoord0 = TexCoord + Coord0Offset * InvTexSize * Defocus;
Output.TexCoord1 = TexCoord + Coord1Offset * InvTexSize * Defocus;
Output.TexCoord2 = TexCoord + Coord2Offset * InvTexSize * Defocus;
diff --git a/hlsl/phosphor.fx b/hlsl/phosphor.fx
index f48417459c4..b1a7f983435 100644
--- a/hlsl/phosphor.fx
+++ b/hlsl/phosphor.fx
@@ -114,8 +114,8 @@ technique TestTechnique
{
Lighting = FALSE;
- //Sampler[0] = <DiffuseSampler>;
- //Sampler[1] = <PreviousSampler>;
+ Sampler[0] = <DiffuseSampler>;
+ Sampler[1] = <PreviousSampler>;
VertexShader = compile vs_2_0 vs_main();
PixelShader = compile ps_2_0 ps_main();
diff --git a/hlsl/post.fx b/hlsl/post.fx
index 4176a78b197..5b4640db496 100644
--- a/hlsl/post.fx
+++ b/hlsl/post.fx
@@ -59,11 +59,9 @@ struct PS_INPUT
uniform float TargetWidth;
uniform float TargetHeight;
-uniform float RawWidth;
-uniform float RawHeight;
+uniform float2 RawDims;
-uniform float WidthRatio;
-uniform float HeightRatio;
+uniform float2 SizeRatio;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@@ -77,11 +75,8 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position.y -= 0.5f;
Output.Position *= float4(2.0f, 2.0f, 1.0f, 1.0f);
Output.Color = Input.Color;
- Output.TexCoord = Input.TexCoord + 0.5f / float2(TargetWidth, TargetHeight);
+ Output.TexCoord = Input.TexCoord + 0.5f / RawDims;//float2(TargetWidth, TargetHeight);
- //float Zoom = 32.0f;
- //Output.TexCoord /= Zoom;
- //Output.TexCoord += float2(0.175f * (1.0f - 1.0f / Zoom) / WidthRatio, 0.175f * (1.0f - 1.0f / Zoom) / HeightRatio);
return Output;
}
@@ -117,7 +112,7 @@ uniform float3 Floor = float3(0.0f, 0.0f, 0.0f);
float4 ps_main(PS_INPUT Input) : COLOR
{
- float2 Ratios = float2(WidthRatio, HeightRatio);
+ float2 Ratios = 1.0f / SizeRatio;
// -- Screen Pincushion Calculation --
float2 PinViewpointOffset = float2(0.0f, 0.0f);
@@ -153,14 +148,12 @@ float4 ps_main(PS_INPUT Input) : COLOR
float4 BaseTexel = tex2D(DiffuseSampler, BaseCoord);
// -- Alpha Clipping (1px border in drawd3d does not work for some reason) --
- clip((BaseCoord.x < 1.0f / RawWidth) ? -1 : 1);
- clip((BaseCoord.y < 1.0f / RawHeight) ? -1 : 1);
- clip((BaseCoord.x > (1.0f / WidthRatio + 1.0f / RawWidth)) ? -1 : 1);
- clip((BaseCoord.y > (1.0f / HeightRatio + 1.0f / RawHeight)) ? -1 : 1);
+ clip((BaseCoord < 1.0f / RawDims) ? -1 : 1);
+ clip((BaseCoord > (SizeRatio + 1.0f / RawDims)) ? -1 : 1);
// -- Scanline Simulation --
- float InnerSine = ScanCoord.y * RawHeight * ScanlineScale;
- float ScanBrightMod = sin(InnerSine * PI + ScanlineOffset * RawHeight);
+ float InnerSine = ScanCoord.y * RawDims.y * ScanlineScale;
+ float ScanBrightMod = sin(InnerSine * PI + ScanlineOffset * RawDims.y);
float3 ScanBrightness = lerp(1.0f, (pow(ScanBrightMod * ScanBrightMod, ScanlineHeight) * ScanlineBrightScale + 1.0f) * 0.5f, ScanlineAmount);
float3 Scanned = BaseTexel.rgb * ScanBrightness;
diff --git a/hlsl/prescale.fx b/hlsl/prescale.fx
index 10420af1b85..965d89691f8 100644
--- a/hlsl/prescale.fx
+++ b/hlsl/prescale.fx
@@ -41,11 +41,10 @@ struct PS_INPUT
// Passthrough Vertex Shader
//-----------------------------------------------------------------------------
-float TargetWidth;
-float TargetHeight;
+uniform float TargetWidth;
+uniform float TargetHeight;
-float RawWidth;
-float RawHeight;
+uniform float2 RawDims;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@@ -70,14 +69,13 @@ VS_OUTPUT vs_main(VS_INPUT Input)
float4 ps_main(PS_INPUT Input) : COLOR
{
- float2 RawDims = float2(RawWidth, RawHeight);
- float2 TexCoord = Input.TexCoord * RawDims;
- TexCoord -= frac(TexCoord);
- TexCoord += 0.5f;
- TexCoord /= RawDims;
-
- float4 Center = tex2D(DiffuseSampler, TexCoord);
- return Center;
+ //float2 TexCoord = Input.TexCoord * RawDims;
+ //TexCoord -= frac(TexCoord);
+ //TexCoord += 0.5f;
+ //TexCoord /= RawDims;
+ //
+ //return tex2D(DiffuseSampler, TexCoord);
+ return tex2D(DiffuseSampler, Input.TexCoord);
}
//-----------------------------------------------------------------------------
diff --git a/hlsl/yiq_decode.fx b/hlsl/yiq_decode.fx
index c94ae76de0d..af3c01c34ab 100644
--- a/hlsl/yiq_decode.fx
+++ b/hlsl/yiq_decode.fx
@@ -57,8 +57,7 @@ struct PS_INPUT
uniform float TargetWidth;
uniform float TargetHeight;
-uniform float RawWidth;
-uniform float RawHeight;
+uniform float2 RawDims;
uniform float WidthRatio;
uniform float HeightRatio;
@@ -75,7 +74,7 @@ VS_OUTPUT vs_main(VS_INPUT Input)
Output.Position.y -= 0.5f;
Output.Position *= float4(2.0f, 2.0f, 1.0f, 1.0f);
Output.Coord0.xy = Input.TexCoord;
- Output.Coord0.zw = float2(1.0f / RawWidth, 0.0f);
+ Output.Coord0.zw = float2(1.0f / RawDims.x, 0.0f);
return Output;
}
@@ -98,8 +97,6 @@ uniform float QFreqResponse = 0.6f;
float4 ps_main(PS_INPUT Input) : COLOR
{
- float2 RawDims = float2(RawWidth, RawHeight);
-
float4 BaseTexel = tex2D(DiffuseSampler, Input.Coord0.xy + 0.5f / RawDims);
// YIQ convolution: N coefficients each
@@ -109,11 +106,11 @@ float4 ps_main(PS_INPUT Input) : COLOR
float MaxC = 2.1183f;
float MinC = -1.1183f;
float CRange = MaxC - MinC;
- float Fc_y1 = (CCValue - NotchHalfWidth) * ScanTime / (RawWidth * 4.0f / WidthRatio);
- float Fc_y2 = (CCValue + NotchHalfWidth) * ScanTime / (RawWidth * 4.0f / WidthRatio);
- float Fc_y3 = YFreqResponse * ScanTime / (RawWidth * 4.0f / WidthRatio);
- float Fc_i = IFreqResponse * ScanTime / (RawWidth * 4.0f / WidthRatio);
- float Fc_q = QFreqResponse * ScanTime / (RawWidth * 4.0f / WidthRatio);
+ float Fc_y1 = (CCValue - NotchHalfWidth) * ScanTime / (RawDims.x * 4.0f / WidthRatio);
+ float Fc_y2 = (CCValue + NotchHalfWidth) * ScanTime / (RawDims.x * 4.0f / WidthRatio);
+ float Fc_y3 = YFreqResponse * ScanTime / (RawDims.x * 4.0f / WidthRatio);
+ float Fc_i = IFreqResponse * ScanTime / (RawDims.x * 4.0f / WidthRatio);
+ float Fc_q = QFreqResponse * ScanTime / (RawDims.x * 4.0f / WidthRatio);
float PI = 3.1415926535897932384626433832795;
float PI2 = 2.0f * PI;
float PI2Length = PI2 / 82.0f;
@@ -126,7 +123,7 @@ float4 ps_main(PS_INPUT Input) : COLOR
float4 CoordY = Input.Coord0.y;
float2 TexCoord = float2(CoordX.r, CoordY.r);
float4 C = tex2D(CompositeSampler, TexCoord + float2(0.625f, 0.4f) / RawDims) * CRange + MinC;
- float4 WT = W * (CoordX * WidthRatio + AValue * CoordY * 2.0f * (RawHeight / HeightRatio) + BValue) + OValue;
+ float4 WT = W * (CoordX * WidthRatio + AValue * CoordY * 2.0f * (RawDims.y / HeightRatio) + BValue) + OValue;
float4 SincYIn1 = PI2 * Fc_y1 * n4;
float4 SincYIn2 = PI2 * Fc_y2 * n4;
diff --git a/hlsl/yiq_encode.fx b/hlsl/yiq_encode.fx
index d9c888d5a3c..2a2a1e40851 100644
--- a/hlsl/yiq_encode.fx
+++ b/hlsl/yiq_encode.fx
@@ -52,11 +52,9 @@ struct PS_INPUT
uniform float TargetWidth;
uniform float TargetHeight;
-uniform float RawWidth;
-uniform float RawHeight;
+uniform float2 RawDims;
-uniform float WidthRatio;
-uniform float HeightRatio;
+uniform float2 SizeRatio;
VS_OUTPUT vs_main(VS_INPUT Input)
{
@@ -90,26 +88,24 @@ uniform float ScanTime = 52.6f;
float4 ps_main(PS_INPUT Input) : COLOR
{
- float2 Scaler = float2(RawWidth, RawHeight);
- float2 InvRatios = float2(1.0f / WidthRatio, 1.0f / HeightRatio);
+ float2 Coord0 = Input.Coord0 + float2(PValue * 0.00f, 0.0f) / RawDims;
+ float2 Coord1 = Input.Coord1 + float2(PValue * 0.25f, 0.0f) / RawDims;
+ float2 Coord2 = Input.Coord2 + float2(PValue * 0.50f, 0.0f) / RawDims;
+ float2 Coord3 = Input.Coord3 + float2(PValue * 0.75f, 0.0f) / RawDims;
- float2 Coord0 = Input.Coord0 + float2(PValue * 0.00f, 0.0f) / Scaler;
- float2 Coord1 = Input.Coord1 + float2(PValue * 0.25f, 0.0f) / Scaler;
- float2 Coord2 = Input.Coord2 + float2(PValue * 0.50f, 0.0f) / Scaler;
- float2 Coord3 = Input.Coord3 + float2(PValue * 0.75f, 0.0f) / Scaler;
-
- float2 TexelOffset = 0.5f / Scaler;
+ float2 TexelOffset = 0.5f / RawDims;
float3 Texel0 = tex2D(DiffuseSampler, Coord0 + TexelOffset).rgb;
float3 Texel1 = tex2D(DiffuseSampler, Coord1 + TexelOffset).rgb;
float3 Texel2 = tex2D(DiffuseSampler, Coord2 + TexelOffset).rgb;
float3 Texel3 = tex2D(DiffuseSampler, Coord3 + TexelOffset).rgb;
+ float2 InvSize = 1.0f / SizeRatio;
float PI = 3.1415926535897932384626433832795;
float W = PI * 2.0f * CCValue * ScanTime;
- float T0 = Coord0.x * WidthRatio + AValue * Coord0.y * 2.0f * (RawHeight / HeightRatio) + BValue;
- float T1 = Coord1.x * WidthRatio + AValue * Coord1.y * 2.0f * (RawHeight / HeightRatio) + BValue;
- float T2 = Coord2.x * WidthRatio + AValue * Coord2.y * 2.0f * (RawHeight / HeightRatio) + BValue;
- float T3 = Coord3.x * WidthRatio + AValue * Coord3.y * 2.0f * (RawHeight / HeightRatio) + BValue;
+ float T0 = Coord0.x * InvSize.x + AValue * Coord0.y * 2.0f * (RawDims.y / InvSize.y) + BValue;
+ float T1 = Coord1.x * InvSize.x + AValue * Coord1.y * 2.0f * (RawDims.y / InvSize.y) + BValue;
+ float T2 = Coord2.x * InvSize.x + AValue * Coord2.y * 2.0f * (RawDims.y / InvSize.y) + BValue;
+ float T3 = Coord3.x * InvSize.x + AValue * Coord3.y * 2.0f * (RawDims.y / InvSize.y) + BValue;
float Y0 = dot(Texel0, float3(0.299f, 0.587f, 0.114f));
float I0 = dot(Texel0, float3(0.595716f, -0.274453f, -0.321263f));
diff --git a/src/emu/render.c b/src/emu/render.c
index 1f6c6578ee2..82832202242 100644
--- a/src/emu/render.c
+++ b/src/emu/render.c
@@ -364,6 +364,7 @@ render_texture::render_texture()
m_format(TEXFORMAT_ARGB32),
m_bcglookup(NULL),
m_bcglookup_entries(0),
+ m_osddata(~0L),
m_scaler(NULL),
m_param(NULL),
m_curseq(0)
@@ -397,6 +398,7 @@ void render_texture::reset(render_manager &manager, texture_scaler_func scaler,
m_scaler = scaler;
m_param = param;
}
+ m_osddata = ~0L;
}
@@ -491,6 +493,8 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &t
if (dwidth < 1) dwidth = 1;
if (dheight < 1) dheight = 1;
+ texinfo.osddata = m_osddata;
+
// are we scaler-free? if so, just return the source bitmap
const rgb_t *palbase = (m_format == TEXFORMAT_PALETTE16 || m_format == TEXFORMAT_PALETTEA16) ? palette_entry_list_adjusted(m_bitmap->palette()) : NULL;
if (m_scaler == NULL || (m_bitmap != NULL && swidth == dwidth && sheight == dheight))
@@ -502,7 +506,6 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &t
texinfo.width = swidth;
texinfo.height = sheight;
texinfo.palette = palbase;
- texinfo.osddata = m_osddata;
texinfo.seqid = ++m_curseq;
return true;
}
diff --git a/src/osd/windows/d3d8intf.c b/src/osd/windows/d3d8intf.c
deleted file mode 100644
index fa408d8cf65..00000000000
--- a/src/osd/windows/d3d8intf.c
+++ /dev/null
@@ -1,707 +0,0 @@
-//============================================================
-//
-// d3d8intf.c - Direct3D 8.1 abstraction layer
-//
-//============================================================
-//
-// Copyright Aaron Giles
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or
-// without modification, are permitted provided that the
-// following conditions are met:
-//
-// * Redistributions of source code must retain the above
-// copyright notice, this list of conditions and the
-// following disclaimer.
-// * Redistributions in binary form must reproduce the
-// above copyright notice, this list of conditions and
-// the following disclaimer in the documentation and/or
-// other materials provided with the distribution.
-// * Neither the name 'MAME' nor the names of its
-// contributors may be used to endorse or promote
-// products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
-// EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
-// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-//============================================================
-
-// standard windows headers
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <d3d8.h>
-#define D3DXVECTOR4 void
-#undef interface
-
-// MAME headers
-#include "emu.h"
-
-// MAMEOS headers
-#include "d3dintf.h"
-#include "winmain.h"
-
-
-
-//============================================================
-// TYPE DEFINITIONS
-//============================================================
-
-typedef IDirect3D8 *(WINAPI *direct3dcreate8_ptr)(UINT SDKVersion);
-
-
-
-//============================================================
-// PROTOTYPES
-//============================================================
-
-static void set_interfaces(d3d_base *d3dptr);
-
-
-
-//============================================================
-// INLINES
-//============================================================
-
-INLINE void convert_present_params(const d3d_present_parameters *params, D3DPRESENT_PARAMETERS *d3d8params)
-{
- memset(d3d8params, 0, sizeof(*d3d8params));
- d3d8params->BackBufferWidth = params->BackBufferWidth;
- d3d8params->BackBufferHeight = params->BackBufferHeight;
- d3d8params->BackBufferFormat = params->BackBufferFormat;
- d3d8params->BackBufferCount = params->BackBufferCount;
- d3d8params->MultiSampleType = params->MultiSampleType;
-// d3d8params->MultiSampleQuality = params->MultiSampleQuality;
- d3d8params->SwapEffect = params->SwapEffect;
- d3d8params->hDeviceWindow = params->hDeviceWindow;
- d3d8params->Windowed = params->Windowed;
- d3d8params->EnableAutoDepthStencil = params->EnableAutoDepthStencil;
- d3d8params->AutoDepthStencilFormat = params->AutoDepthStencilFormat;
- d3d8params->Flags = params->Flags;
- d3d8params->FullScreen_RefreshRateInHz = params->FullScreen_RefreshRateInHz;
- d3d8params->FullScreen_PresentationInterval = params->PresentationInterval;
- if (d3d8params->Windowed)
- d3d8params->FullScreen_PresentationInterval = 0;
-}
-
-
-
-//============================================================
-// drawd3d8_init
-//============================================================
-
-d3d_base *drawd3d8_init(void)
-{
- direct3dcreate8_ptr direct3dcreate8;
- HINSTANCE dllhandle;
- IDirect3D8 *d3d8;
- d3d_base *d3dptr;
-
- // dynamically grab the create function from d3d8.dll
- dllhandle = LoadLibrary(TEXT("d3d8.dll"));
- if (dllhandle == NULL)
- {
- mame_printf_verbose("Direct3D: Unable to access d3d8.dll\n");
- return NULL;
- }
-
- // import the create function
- direct3dcreate8 = (direct3dcreate8_ptr)GetProcAddress(dllhandle, "Direct3DCreate8");
- if (direct3dcreate8 == NULL)
- {
- mame_printf_verbose("Direct3D: Unable to find Direct3DCreate8\n");
- FreeLibrary(dllhandle);
- dllhandle = NULL;
- return NULL;
- }
-
- // create our core direct 3d object
- d3d8 = (*direct3dcreate8)(D3D_SDK_VERSION);
- if (d3d8 == NULL)
- {
- mame_printf_verbose("Direct3D: Error attempting to initialize Direct3D8\n");
- FreeLibrary(dllhandle);
- dllhandle = NULL;
- return NULL;
- }
-
- // allocate an object to hold our data
- d3dptr = global_alloc(d3d_base);
- d3dptr->version = 8;
- d3dptr->d3dobj = d3d8;
- d3dptr->dllhandle = dllhandle;
- d3dptr->post_fx_available = false;
- set_interfaces(d3dptr);
-
- mame_printf_verbose("Direct3D: Using Direct3D 8\n");
- return d3dptr;
-}
-
-
-
-//============================================================
-// Direct3D interfaces
-//============================================================
-
-static HRESULT d3d_check_device_format(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_CheckDeviceFormat(d3d8, adapter, devtype, adapterformat, usage, restype, format);
-}
-
-
-static HRESULT d3d_check_device_type(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_CheckDeviceType(d3d8, adapter, devtype, format, backformat, windowed);
-}
-
-
-static HRESULT d3d_create_device(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, d3d_present_parameters *params, d3d_device **dev)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- D3DPRESENT_PARAMETERS d3d8params;
- convert_present_params(params, &d3d8params);
- return IDirect3D8_CreateDevice(d3d8, adapter, devtype, focus, behavior, &d3d8params, (IDirect3DDevice8 **)dev);
-}
-
-
-static HRESULT d3d_enum_adapter_modes(d3d_base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_EnumAdapterModes(d3d8, adapter, index, mode);
-}
-
-
-static UINT d3d_get_adapter_count(d3d_base *d3dptr)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_GetAdapterCount(d3d8);
-}
-
-
-static HRESULT d3d_get_adapter_display_mode(d3d_base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_GetAdapterDisplayMode(d3d8, adapter, mode);
-}
-
-
-static HRESULT d3d_get_adapter_identifier(d3d_base *d3dptr, UINT adapter, DWORD flags, d3d_adapter_identifier *identifier)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- D3DADAPTER_IDENTIFIER8 id;
- HRESULT result = IDirect3D8_GetAdapterIdentifier(d3d8, adapter, flags, &id);
- memcpy(identifier->Driver, id.Driver, sizeof(identifier->Driver));
- memcpy(identifier->Description, id.Description, sizeof(identifier->Description));
- identifier->DriverVersion = id.DriverVersion;
- identifier->VendorId = id.VendorId;
- identifier->DeviceId = id.DeviceId;
- identifier->SubSysId = id.SubSysId;
- identifier->Revision = id.Revision;
- identifier->DeviceIdentifier = id.DeviceIdentifier;
- identifier->WHQLLevel = id.WHQLLevel;
- return result;
-}
-
-
-static UINT d3d_get_adapter_mode_count(d3d_base *d3dptr, UINT adapter, D3DFORMAT format)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_GetAdapterModeCount(d3d8, adapter);
-}
-
-
-static HMONITOR d3d_get_adapter_monitor(d3d_base *d3dptr, UINT adapter)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- return IDirect3D8_GetAdapterMonitor(d3d8, adapter);
-}
-
-
-static HRESULT d3d_get_caps_dword(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, d3d_caps_index which, DWORD *value)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- D3DCAPS8 caps;
- HRESULT result = IDirect3D8_GetDeviceCaps(d3d8, adapter, devtype, &caps);
- switch (which)
- {
- case CAPS_PRESENTATION_INTERVALS: *value = caps.PresentationIntervals; break;
- case CAPS_CAPS2: *value = caps.DevCaps; break;
- case CAPS_DEV_CAPS: *value = caps.DevCaps; break;
- case CAPS_SRCBLEND_CAPS: *value = caps.SrcBlendCaps; break;
- case CAPS_DSTBLEND_CAPS: *value = caps.DestBlendCaps; break;
- case CAPS_TEXTURE_CAPS: *value = caps.TextureCaps; break;
- case CAPS_TEXTURE_FILTER_CAPS: *value = caps.TextureFilterCaps; break;
- case CAPS_TEXTURE_ADDRESS_CAPS: *value = caps.TextureAddressCaps; break;
- case CAPS_TEXTURE_OP_CAPS: *value = caps.TextureOpCaps; break;
- case CAPS_MAX_TEXTURE_ASPECT: *value = caps.MaxTextureAspectRatio; break;
- case CAPS_MAX_TEXTURE_WIDTH: *value = caps.MaxTextureWidth; break;
- case CAPS_MAX_TEXTURE_HEIGHT: *value = caps.MaxTextureHeight; break;
- case CAPS_STRETCH_RECT_FILTER: *value = 0; break;
- case CAPS_MAX_PS30_INSN_SLOTS: *value = 0; break;
- }
- return result;
-}
-
-
-static ULONG d3d_release(d3d_base *d3dptr)
-{
- IDirect3D8 *d3d8 = (IDirect3D8 *)d3dptr->d3dobj;
- ULONG result = IDirect3D8_Release(d3d8);
- FreeLibrary(d3dptr->dllhandle);
- global_free(d3dptr);
- return result;
-}
-
-
-static const d3d_interface d3d8_interface =
-{
- d3d_check_device_format,
- d3d_check_device_type,
- d3d_create_device,
- d3d_enum_adapter_modes,
- d3d_get_adapter_count,
- d3d_get_adapter_display_mode,
- d3d_get_adapter_identifier,
- d3d_get_adapter_mode_count,
- d3d_get_adapter_monitor,
- d3d_get_caps_dword,
- d3d_release
-};
-
-
-
-//============================================================
-// Direct3DDevice interfaces
-//============================================================
-
-static HRESULT d3d_device_begin_scene(d3d_device *dev)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_BeginScene(device);
-}
-
-
-static HRESULT d3d_device_clear(d3d_device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_Clear(device, count, rects, flags, color, z, stencil);
-}
-
-
-static HRESULT d3d_device_create_offscreen_plain_surface(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, d3d_surface **surface)
-{
- assert(FALSE);
- return D3D_OK;
-}
-
-
-static HRESULT d3d_device_create_effect(d3d_device *dev, const WCHAR *name, d3d_effect **effect)
-{
- assert(FALSE);
- return D3D_OK;
-}
-
-
-
-static HRESULT d3d_device_create_texture(d3d_device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, d3d_texture **texture)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_CreateTexture(device, width, height, levels, usage, format, pool, (IDirect3DTexture8 **)texture);
-}
-
-
-static HRESULT d3d_device_create_vertex_buffer(d3d_device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, d3d_vertex_buffer **buf)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_CreateVertexBuffer(device, length, usage, fvf, pool, (IDirect3DVertexBuffer8 **)buf);
-}
-
-
-static HRESULT d3d_device_draw_primitive(d3d_device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_DrawPrimitive(device, type, start, count);
-}
-
-
-static HRESULT d3d_device_end_scene(d3d_device *dev)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_EndScene(device);
-}
-
-
-static HRESULT d3d_device_get_raster_status(d3d_device *dev, D3DRASTER_STATUS *status)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_GetRasterStatus(device, status);
-}
-
-
-static HRESULT d3d_device_get_render_target(d3d_device *dev, DWORD index, d3d_surface **surface)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- assert(index == 0);
- return IDirect3DDevice8_GetRenderTarget(device, (IDirect3DSurface8 **)surface);
-}
-
-
-static HRESULT d3d_device_get_render_target_data(d3d_device *dev, d3d_surface *rendertarget, d3d_surface *destsurface)
-{
- assert(false);
- return D3D_OK;
-}
-
-
-static HRESULT d3d_device_present(d3d_device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_Present(device, source, dest, override, dirty);
-}
-
-
-static ULONG d3d_device_release(d3d_device *dev)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_Release(device);
-}
-
-
-static HRESULT d3d_device_reset(d3d_device *dev, d3d_present_parameters *params)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- D3DPRESENT_PARAMETERS d3d8params;
- convert_present_params(params, &d3d8params);
- return IDirect3DDevice8_Reset(device, &d3d8params);
-}
-
-
-static void d3d_device_set_gamma_ramp(d3d_device *dev, DWORD flags, const D3DGAMMARAMP *ramp)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- IDirect3DDevice8_SetGammaRamp(device, flags, ramp);
-}
-
-
-static HRESULT d3d_device_set_render_state(d3d_device *dev, D3DRENDERSTATETYPE state, DWORD value)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_SetRenderState(device, state, value);
-}
-
-
-static HRESULT d3d_device_set_render_target(d3d_device *dev, DWORD index, d3d_surface *surf)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- IDirect3DSurface8 *surface = (IDirect3DSurface8 *)surf;
- assert(index == 0);
- return IDirect3DDevice8_SetRenderTarget(device, surface, NULL);
-}
-
-
-static HRESULT d3d_device_create_render_target(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, d3d_surface **surface)
-{
- assert(false);
- return D3D_OK;
-}
-
-
-static HRESULT d3d_device_set_stream_source(d3d_device *dev, UINT number, d3d_vertex_buffer *vbuf, UINT stride)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- IDirect3DVertexBuffer8 *vertexbuf = (IDirect3DVertexBuffer8 *)vbuf;
- return IDirect3DDevice8_SetStreamSource(device, number, vertexbuf, stride);
-}
-
-
-static HRESULT d3d_device_set_texture(d3d_device *dev, DWORD stage, d3d_texture *tex)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- IDirect3DBaseTexture8 *texture = (IDirect3DBaseTexture8 *)tex;
- return IDirect3DDevice8_SetTexture(device, stage, texture);
-}
-
-
-static HRESULT d3d_device_set_texture_stage_state(d3d_device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_SetTextureStageState(device, stage, state, value);
-}
-
-
-static HRESULT d3d_device_set_vertex_format(d3d_device *dev, D3DFORMAT format)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_SetVertexShader(device, format);
-}
-
-
-static HRESULT d3d_device_stretch_rect(d3d_device *dev, d3d_surface *source, const RECT *srcrect, d3d_surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter)
-{
- assert(FALSE);
- return D3D_OK;
-}
-
-
-static HRESULT d3d_device_test_cooperative_level(d3d_device *dev)
-{
- IDirect3DDevice8 *device = (IDirect3DDevice8 *)dev;
- return IDirect3DDevice8_TestCooperativeLevel(device);
-}
-
-
-static const d3d_device_interface d3d8_device_interface =
-{
- d3d_device_begin_scene,
- d3d_device_clear,
- d3d_device_create_offscreen_plain_surface,
- d3d_device_create_effect,
- d3d_device_create_texture,
- d3d_device_create_vertex_buffer,
- d3d_device_create_render_target,
- d3d_device_draw_primitive,
- d3d_device_end_scene,
- d3d_device_get_raster_status,
- d3d_device_get_render_target,
- d3d_device_get_render_target_data,
- d3d_device_present,
- d3d_device_release,
- d3d_device_reset,
- d3d_device_set_gamma_ramp,
- d3d_device_set_render_state,
- d3d_device_set_render_target,
- d3d_device_set_stream_source,
- d3d_device_set_texture,
- d3d_device_set_texture_stage_state,
- d3d_device_set_vertex_format,
- d3d_device_stretch_rect,
- d3d_device_test_cooperative_level
-};
-
-
-
-//============================================================
-// Direct3DSurface interfaces
-//============================================================
-
-static HRESULT d3d_surface_lock_rect(d3d_surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
-{
- IDirect3DSurface8 *surface = (IDirect3DSurface8 *)surf;
- return IDirect3DSurface8_LockRect(surface, locked, rect, flags);
-}
-
-
-static ULONG d3d_surface_release(d3d_surface *surf)
-{
- IDirect3DSurface8 *surface = (IDirect3DSurface8 *)surf;
- return IDirect3DSurface8_Release(surface);
-}
-
-
-static HRESULT d3d_surface_unlock_rect(d3d_surface *surf)
-{
- IDirect3DSurface8 *surface = (IDirect3DSurface8 *)surf;
- return IDirect3DSurface8_UnlockRect(surface);
-}
-
-
-static const d3d_surface_interface d3d8_surface_interface =
-{
- d3d_surface_lock_rect,
- d3d_surface_release,
- d3d_surface_unlock_rect
-};
-
-
-
-//============================================================
-// Direct3DTexture interfaces
-//============================================================
-
-static HRESULT d3d_texture_get_surface_level(d3d_texture *tex, UINT level, d3d_surface **surface)
-{
- IDirect3DTexture8 *texture = (IDirect3DTexture8 *)tex;
- return IDirect3DTexture8_GetSurfaceLevel(texture, level, (IDirect3DSurface8 **)surface);
-}
-
-
-static HRESULT d3d_texture_lock_rect(d3d_texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
-{
- IDirect3DTexture8 *texture = (IDirect3DTexture8 *)tex;
- return IDirect3DTexture8_LockRect(texture, level, locked, rect, flags);
-}
-
-
-static ULONG d3d_texture_release(d3d_texture *tex)
-{
- IDirect3DTexture8 *texture = (IDirect3DTexture8 *)tex;
- return IDirect3DTexture8_Release(texture);
-}
-
-
-static HRESULT d3d_texture_unlock_rect(d3d_texture *tex, UINT level)
-{
- IDirect3DTexture8 *texture = (IDirect3DTexture8 *)tex;
- return IDirect3DTexture8_UnlockRect(texture, level);
-}
-
-
-static const d3d_texture_interface d3d8_texture_interface =
-{
- d3d_texture_get_surface_level,
- d3d_texture_lock_rect,
- d3d_texture_release,
- d3d_texture_unlock_rect
-};
-
-
-
-//============================================================
-// Direct3DVertexBuffer interfaces
-//============================================================
-
-static HRESULT d3d_vertex_buffer_lock(d3d_vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags)
-{
- IDirect3DVertexBuffer8 *vertexbuf = (IDirect3DVertexBuffer8 *)vbuf;
- return IDirect3DVertexBuffer8_Lock(vertexbuf, offset, size, (BYTE **)data, flags);
-}
-
-
-static ULONG d3d_vertex_buffer_release(d3d_vertex_buffer *vbuf)
-{
- IDirect3DVertexBuffer8 *vertexbuf = (IDirect3DVertexBuffer8 *)vbuf;
- return IDirect3DVertexBuffer8_Release(vertexbuf);
-}
-
-
-static HRESULT d3d_vertex_buffer_unlock(d3d_vertex_buffer *vbuf)
-{
- IDirect3DVertexBuffer8 *vertexbuf = (IDirect3DVertexBuffer8 *)vbuf;
- return IDirect3DVertexBuffer8_Unlock(vertexbuf);
-}
-
-
-static const d3d_vertex_buffer_interface d3d8_vertex_buffer_interface =
-{
- d3d_vertex_buffer_lock,
- d3d_vertex_buffer_release,
- d3d_vertex_buffer_unlock
-};
-
-
-
-//============================================================
-// Direct3DEffect interfaces
-//============================================================
-
-static void d3d_effect_begin(d3d_effect *effect, UINT *passes, DWORD flags)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_end(d3d_effect *effect)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_begin_pass(d3d_effect *effect, UINT pass)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_end_pass(d3d_effect *effect)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_technique(d3d_effect *effect, const char *name)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_vector(d3d_effect *effect, const char *name, int count, float *vector)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_float(d3d_effect *effect, const char *name, float value)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_int(d3d_effect *effect, const char *name, int value)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_matrix(d3d_effect *effect, const char *name, d3d_matrix *matrix)
-{
- assert(FALSE);
-}
-
-
-static void d3d_effect_set_texture(d3d_effect *effect, const char *name, d3d_texture *tex)
-{
- assert(FALSE);
-}
-
-
-static ULONG d3d_effect_release(d3d_effect *effect)
-{
- assert(FALSE);
- return 0;
-}
-
-
-static const d3d_effect_interface d3d8_effect_interface =
-{
- d3d_effect_begin,
- d3d_effect_end,
- d3d_effect_begin_pass,
- d3d_effect_end_pass,
- d3d_effect_set_technique,
- d3d_effect_set_vector,
- d3d_effect_set_float,
- d3d_effect_set_int,
- d3d_effect_set_matrix,
- d3d_effect_set_texture,
- d3d_effect_release
-};
-
-
-
-//============================================================
-// set_interfaces
-//============================================================
-
-static void set_interfaces(d3d_base *d3dptr)
-{
- d3dptr->d3d = d3d8_interface;
- d3dptr->device = d3d8_device_interface;
- d3dptr->surface = d3d8_surface_interface;
- d3dptr->texture = d3d8_texture_interface;
- d3dptr->vertexbuf = d3d8_vertex_buffer_interface;
- d3dptr->effect = d3d8_effect_interface;
-}
diff --git a/src/osd/windows/d3d9intf.c b/src/osd/windows/d3d9intf.c
index dc15f8f4d29..3f0002b3d61 100644
--- a/src/osd/windows/d3d9intf.c
+++ b/src/osd/windows/d3d9intf.c
@@ -65,17 +65,20 @@ typedef HRESULT (WINAPI *direct3dx9_loadeffect_ptr)(LPDIRECT3DDEVICE9 pDevice, L
static direct3dx9_loadeffect_ptr g_load_effect = NULL;
+namespace d3d
+{
+
//============================================================
// PROTOTYPES
//============================================================
-static void set_interfaces(d3d_base *d3dptr);
+static void set_interfaces(base *d3dptr);
//============================================================
// INLINES
//============================================================
-INLINE void convert_present_params(const d3d_present_parameters *params, D3DPRESENT_PARAMETERS *d3d9params)
+INLINE void convert_present_params(const present_parameters *params, D3DPRESENT_PARAMETERS *d3d9params)
{
memset(d3d9params, 0, sizeof(*d3d9params));
d3d9params->BackBufferWidth = params->BackBufferWidth;
@@ -100,12 +103,12 @@ INLINE void convert_present_params(const d3d_present_parameters *params, D3DPRES
// drawd3d9_init
//============================================================
-d3d_base *drawd3d9_init(void)
+base *drawd3d9_init(void)
{
direct3dcreate9_ptr direct3dcreate9;
HINSTANCE dllhandle;
IDirect3D9 *d3d9;
- d3d_base *d3dptr;
+ base *d3dptr;
bool post_available = true;
// dynamically grab the create function from d3d9.dll
@@ -165,7 +168,7 @@ d3d_base *drawd3d9_init(void)
}
// allocate an object to hold our data
- d3dptr = global_alloc(d3d_base);
+ d3dptr = global_alloc(base);
d3dptr->version = 9;
d3dptr->d3dobj = d3d9;
d3dptr->dllhandle = dllhandle;
@@ -182,20 +185,20 @@ d3d_base *drawd3d9_init(void)
// Direct3D interfaces
//============================================================
-static HRESULT d3d_check_device_format(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format)
+static HRESULT check_device_format(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_CheckDeviceFormat(d3d9, adapter, devtype, adapterformat, usage, restype, format);
}
-static HRESULT d3d_check_device_type(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed)
+static HRESULT check_device_type(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_CheckDeviceType(d3d9, adapter, devtype, format, backformat, windowed);
}
-static HRESULT d3d_create_device(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, d3d_present_parameters *params, d3d_device **dev)
+static HRESULT create_device(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, present_parameters *params, device **dev)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
D3DPRESENT_PARAMETERS d3d9params;
@@ -203,28 +206,28 @@ static HRESULT d3d_create_device(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devt
return IDirect3D9_CreateDevice(d3d9, adapter, devtype, focus, behavior, &d3d9params, (IDirect3DDevice9 **)dev);
}
-static HRESULT d3d_enum_adapter_modes(d3d_base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode)
+static HRESULT enum_adapter_modes(base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_EnumAdapterModes(d3d9, adapter, format, index, mode);
}
-static UINT d3d_get_adapter_count(d3d_base *d3dptr)
+static UINT get_adapter_count(base *d3dptr)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_GetAdapterCount(d3d9);
}
-static HRESULT d3d_get_adapter_display_mode(d3d_base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode)
+static HRESULT get_adapter_display_mode(base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_GetAdapterDisplayMode(d3d9, adapter, mode);
}
-static HRESULT d3d_get_adapter_identifier(d3d_base *d3dptr, UINT adapter, DWORD flags, d3d_adapter_identifier *identifier)
+static HRESULT get_adapter_identifier(base *d3dptr, UINT adapter, DWORD flags, adapter_identifier *identifier)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
D3DADAPTER_IDENTIFIER9 id;
@@ -242,21 +245,21 @@ static HRESULT d3d_get_adapter_identifier(d3d_base *d3dptr, UINT adapter, DWORD
}
-static UINT d3d_get_adapter_mode_count(d3d_base *d3dptr, UINT adapter, D3DFORMAT format)
+static UINT get_adapter_mode_count(base *d3dptr, UINT adapter, D3DFORMAT format)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_GetAdapterModeCount(d3d9, adapter, format);
}
-static HMONITOR d3d_get_adapter_monitor(d3d_base *d3dptr, UINT adapter)
+static HMONITOR get_adapter_monitor(base *d3dptr, UINT adapter)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
return IDirect3D9_GetAdapterMonitor(d3d9, adapter);
}
-static HRESULT d3d_get_caps_dword(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, d3d_caps_index which, DWORD *value)
+static HRESULT get_caps_dword(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, caps_index which, DWORD *value)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
D3DCAPS9 caps;
@@ -282,7 +285,7 @@ static HRESULT d3d_get_caps_dword(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE dev
}
-static ULONG d3d_release(d3d_base *d3dptr)
+static ULONG release(base *d3dptr)
{
IDirect3D9 *d3d9 = (IDirect3D9 *)d3dptr->d3dobj;
ULONG result = IDirect3D9_Release(d3d9);
@@ -292,19 +295,19 @@ static ULONG d3d_release(d3d_base *d3dptr)
}
-static const d3d_interface d3d9_interface =
+static const interface d3d9_interface =
{
- d3d_check_device_format,
- d3d_check_device_type,
- d3d_create_device,
- d3d_enum_adapter_modes,
- d3d_get_adapter_count,
- d3d_get_adapter_display_mode,
- d3d_get_adapter_identifier,
- d3d_get_adapter_mode_count,
- d3d_get_adapter_monitor,
- d3d_get_caps_dword,
- d3d_release
+ check_device_format,
+ check_device_type,
+ create_device,
+ enum_adapter_modes,
+ get_adapter_count,
+ get_adapter_display_mode,
+ get_adapter_identifier,
+ get_adapter_mode_count,
+ get_adapter_monitor,
+ get_caps_dword,
+ release
};
@@ -313,27 +316,27 @@ static const d3d_interface d3d9_interface =
// Direct3DDevice interfaces
//============================================================
-static HRESULT d3d_device_begin_scene(d3d_device *dev)
+static HRESULT device_begin_scene(device *dev)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_BeginScene(device);
}
-static HRESULT d3d_device_clear(d3d_device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil)
+static HRESULT device_clear(device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_Clear(device, count, rects, flags, color, z, stencil);
}
-static HRESULT d3d_device_create_offscreen_plain_surface(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, d3d_surface **surface)
+static HRESULT device_create_offscreen_plain_surface(device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, surface **surface)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_CreateOffscreenPlainSurface(device, width, height, format, pool, (IDirect3DSurface9 **)surface, NULL);
}
-static HRESULT d3d_device_create_effect(d3d_device *dev, const WCHAR *name, d3d_effect **effect)
+static HRESULT device_create_effect(device *dev, const WCHAR *name, effect **effect)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
@@ -356,56 +359,56 @@ static HRESULT d3d_device_create_effect(d3d_device *dev, const WCHAR *name, d3d_
}
-static HRESULT d3d_device_create_texture(d3d_device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, d3d_texture **texture)
+static HRESULT device_create_texture(device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, texture **texture)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_CreateTexture(device, width, height, levels, usage, format, pool, (IDirect3DTexture9 **)texture, NULL);
}
-static HRESULT d3d_device_create_vertex_buffer(d3d_device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, d3d_vertex_buffer **buf)
+static HRESULT device_create_vertex_buffer(device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, vertex_buffer **buf)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_CreateVertexBuffer(device, length, usage, fvf, pool, (IDirect3DVertexBuffer9 **)buf, NULL);
}
-static HRESULT d3d_device_draw_primitive(d3d_device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count)
+static HRESULT device_draw_primitive(device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_DrawPrimitive(device, type, start, count);
}
-static HRESULT d3d_device_end_scene(d3d_device *dev)
+static HRESULT device_end_scene(device *dev)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_EndScene(device);
}
-static HRESULT d3d_device_get_raster_status(d3d_device *dev, D3DRASTER_STATUS *status)
+static HRESULT device_get_raster_status(device *dev, D3DRASTER_STATUS *status)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_GetRasterStatus(device, 0, status);
}
-static HRESULT d3d_device_get_render_target(d3d_device *dev, DWORD index, d3d_surface **surface)
+static HRESULT device_get_render_target(device *dev, DWORD index, surface **surface)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_GetRenderTarget(device, index, (IDirect3DSurface9 **)surface);
}
-static HRESULT d3d_device_get_render_target_data(d3d_device *dev, d3d_surface *rendertarget, d3d_surface *destsurface)
+static HRESULT device_get_render_target_data(device *dev, surface *rendertarget, surface *destsurface)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_GetRenderTargetData(device, (IDirect3DSurface9 *)rendertarget, (IDirect3DSurface9 *)destsurface);
}
-static HRESULT d3d_device_present(d3d_device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags)
+static HRESULT device_present(device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
if (flags != 0)
@@ -423,14 +426,14 @@ static HRESULT d3d_device_present(d3d_device *dev, const RECT *source, const REC
}
-static ULONG d3d_device_release(d3d_device *dev)
+static ULONG device_release(device *dev)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_Release(device);
}
-static HRESULT d3d_device_reset(d3d_device *dev, d3d_present_parameters *params)
+static HRESULT device_reset(device *dev, present_parameters *params)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
D3DPRESENT_PARAMETERS d3d9params;
@@ -439,21 +442,21 @@ static HRESULT d3d_device_reset(d3d_device *dev, d3d_present_parameters *params)
}
-static void d3d_device_set_gamma_ramp(d3d_device *dev, DWORD flags, const D3DGAMMARAMP *ramp)
+static void device_set_gamma_ramp(device *dev, DWORD flags, const D3DGAMMARAMP *ramp)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
IDirect3DDevice9_SetGammaRamp(device, 0, flags, ramp);
}
-static HRESULT d3d_device_set_render_state(d3d_device *dev, D3DRENDERSTATETYPE state, DWORD value)
+static HRESULT device_set_render_state(device *dev, D3DRENDERSTATETYPE state, DWORD value)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_SetRenderState(device, state, value);
}
-static HRESULT d3d_device_set_render_target(d3d_device *dev, DWORD index, d3d_surface *surf)
+static HRESULT device_set_render_target(device *dev, DWORD index, surface *surf)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf;
@@ -461,14 +464,14 @@ static HRESULT d3d_device_set_render_target(d3d_device *dev, DWORD index, d3d_su
}
-static HRESULT d3d_device_create_render_target(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, d3d_surface **surface)
+static HRESULT device_create_render_target(device *dev, UINT width, UINT height, D3DFORMAT format, surface **surface)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_CreateRenderTarget(device, width, height, format, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)surface, NULL);
}
-static HRESULT d3d_device_set_stream_source(d3d_device *dev, UINT number, d3d_vertex_buffer *vbuf, UINT stride)
+static HRESULT device_set_stream_source(device *dev, UINT number, vertex_buffer *vbuf, UINT stride)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf;
@@ -476,7 +479,7 @@ static HRESULT d3d_device_set_stream_source(d3d_device *dev, UINT number, d3d_ve
}
-static HRESULT d3d_device_set_texture(d3d_device *dev, DWORD stage, d3d_texture *tex)
+static HRESULT device_set_texture(device *dev, DWORD stage, texture *tex)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
IDirect3DBaseTexture9 *texture = (IDirect3DBaseTexture9 *)tex;
@@ -484,7 +487,7 @@ static HRESULT d3d_device_set_texture(d3d_device *dev, DWORD stage, d3d_texture
}
-static HRESULT d3d_device_set_texture_stage_state(d3d_device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value)
+static HRESULT device_set_texture_stage_state(device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
@@ -515,14 +518,14 @@ static HRESULT d3d_device_set_texture_stage_state(d3d_device *dev, DWORD stage,
}
-static HRESULT d3d_device_set_vertex_format(d3d_device *dev, D3DFORMAT format)
+static HRESULT device_set_vertex_format(device *dev, D3DFORMAT format)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_SetFVF(device, format);
}
-static HRESULT d3d_device_stretch_rect(d3d_device *dev, d3d_surface *source, const RECT *srcrect, d3d_surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter)
+static HRESULT device_stretch_rect(device *dev, surface *source, const RECT *srcrect, surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
IDirect3DSurface9 *ssurface = (IDirect3DSurface9 *)source;
@@ -531,39 +534,39 @@ static HRESULT d3d_device_stretch_rect(d3d_device *dev, d3d_surface *source, con
}
-static HRESULT d3d_device_test_cooperative_level(d3d_device *dev)
+static HRESULT device_test_cooperative_level(device *dev)
{
IDirect3DDevice9 *device = (IDirect3DDevice9 *)dev;
return IDirect3DDevice9_TestCooperativeLevel(device);
}
-static const d3d_device_interface d3d9_device_interface =
-{
- d3d_device_begin_scene,
- d3d_device_clear,
- d3d_device_create_offscreen_plain_surface,
- d3d_device_create_effect,
- d3d_device_create_texture,
- d3d_device_create_vertex_buffer,
- d3d_device_create_render_target,
- d3d_device_draw_primitive,
- d3d_device_end_scene,
- d3d_device_get_raster_status,
- d3d_device_get_render_target,
- d3d_device_get_render_target_data,
- d3d_device_present,
- d3d_device_release,
- d3d_device_reset,
- d3d_device_set_gamma_ramp,
- d3d_device_set_render_state,
- d3d_device_set_render_target,
- d3d_device_set_stream_source,
- d3d_device_set_texture,
- d3d_device_set_texture_stage_state,
- d3d_device_set_vertex_format,
- d3d_device_stretch_rect,
- d3d_device_test_cooperative_level
+static const device_interface d3d9_device_interface =
+{
+ device_begin_scene,
+ device_clear,
+ device_create_offscreen_plain_surface,
+ device_create_effect,
+ device_create_texture,
+ device_create_vertex_buffer,
+ device_create_render_target,
+ device_draw_primitive,
+ device_end_scene,
+ device_get_raster_status,
+ device_get_render_target,
+ device_get_render_target_data,
+ device_present,
+ device_release,
+ device_reset,
+ device_set_gamma_ramp,
+ device_set_render_state,
+ device_set_render_target,
+ device_set_stream_source,
+ device_set_texture,
+ device_set_texture_stage_state,
+ device_set_vertex_format,
+ device_stretch_rect,
+ device_test_cooperative_level
};
@@ -572,32 +575,32 @@ static const d3d_device_interface d3d9_device_interface =
// Direct3DSurface interfaces
//============================================================
-static HRESULT d3d_surface_lock_rect(d3d_surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
+static HRESULT surface_lock_rect(surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
{
IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf;
return IDirect3DSurface9_LockRect(surface, locked, rect, flags);
}
-static ULONG d3d_surface_release(d3d_surface *surf)
+static ULONG surface_release(surface *surf)
{
IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf;
return IDirect3DSurface9_Release(surface);
}
-static HRESULT d3d_surface_unlock_rect(d3d_surface *surf)
+static HRESULT surface_unlock_rect(surface *surf)
{
IDirect3DSurface9 *surface = (IDirect3DSurface9 *)surf;
return IDirect3DSurface9_UnlockRect(surface);
}
-static const d3d_surface_interface d3d9_surface_interface =
+static const surface_interface d3d9_surface_interface =
{
- d3d_surface_lock_rect,
- d3d_surface_release,
- d3d_surface_unlock_rect
+ surface_lock_rect,
+ surface_release,
+ surface_unlock_rect
};
@@ -606,40 +609,40 @@ static const d3d_surface_interface d3d9_surface_interface =
// Direct3DTexture interfaces
//============================================================
-static HRESULT d3d_texture_get_surface_level(d3d_texture *tex, UINT level, d3d_surface **surface)
+static HRESULT texture_get_surface_level(texture *tex, UINT level, surface **surface)
{
IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex;
return IDirect3DTexture9_GetSurfaceLevel(texture, level, (IDirect3DSurface9 **)surface);
}
-static HRESULT d3d_texture_lock_rect(d3d_texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
+static HRESULT texture_lock_rect(texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags)
{
IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex;
return IDirect3DTexture9_LockRect(texture, level, locked, rect, flags);
}
-static ULONG d3d_texture_release(d3d_texture *tex)
+static ULONG texture_release(texture *tex)
{
IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex;
return IDirect3DTexture9_Release(texture);
}
-static HRESULT d3d_texture_unlock_rect(d3d_texture *tex, UINT level)
+static HRESULT texture_unlock_rect(texture *tex, UINT level)
{
IDirect3DTexture9 *texture = (IDirect3DTexture9 *)tex;
return IDirect3DTexture9_UnlockRect(texture, level);
}
-static const d3d_texture_interface d3d9_texture_interface =
+static const texture_interface d3d9_texture_interface =
{
- d3d_texture_get_surface_level,
- d3d_texture_lock_rect,
- d3d_texture_release,
- d3d_texture_unlock_rect
+ texture_get_surface_level,
+ texture_lock_rect,
+ texture_release,
+ texture_unlock_rect
};
@@ -648,32 +651,32 @@ static const d3d_texture_interface d3d9_texture_interface =
// Direct3DVertexBuffer interfaces
//============================================================
-static HRESULT d3d_vertex_buffer_lock(d3d_vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags)
+static HRESULT vertex_buffer_lock(vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags)
{
IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf;
return IDirect3DVertexBuffer9_Lock(vertexbuf, offset, size, data, flags);
}
-static ULONG d3d_vertex_buffer_release(d3d_vertex_buffer *vbuf)
+static ULONG vertex_buffer_release(vertex_buffer *vbuf)
{
IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf;
return IDirect3DVertexBuffer9_Release(vertexbuf);
}
-static HRESULT d3d_vertex_buffer_unlock(d3d_vertex_buffer *vbuf)
+static HRESULT vertex_buffer_unlock(vertex_buffer *vbuf)
{
IDirect3DVertexBuffer9 *vertexbuf = (IDirect3DVertexBuffer9 *)vbuf;
return IDirect3DVertexBuffer9_Unlock(vertexbuf);
}
-static const d3d_vertex_buffer_interface d3d9_vertex_buffer_interface =
+static const vertex_buffer_interface d3d9_vertex_buffer_interface =
{
- d3d_vertex_buffer_lock,
- d3d_vertex_buffer_release,
- d3d_vertex_buffer_unlock
+ vertex_buffer_lock,
+ vertex_buffer_release,
+ vertex_buffer_unlock
};
@@ -682,42 +685,42 @@ static const d3d_vertex_buffer_interface d3d9_vertex_buffer_interface =
// Direct3DEffect interfaces
//============================================================
-static void d3d_effect_begin(d3d_effect *effect, UINT *passes, DWORD flags)
+static void effect_begin(effect *effect, UINT *passes, DWORD flags)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->Begin(passes, flags);
}
-static void d3d_effect_end(d3d_effect *effect)
+static void effect_end(effect *effect)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->End();
}
-static void d3d_effect_begin_pass(d3d_effect *effect, UINT pass)
+static void effect_begin_pass(effect *effect, UINT pass)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->BeginPass(pass);
}
-static void d3d_effect_end_pass(d3d_effect *effect)
+static void effect_end_pass(effect *effect)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->EndPass();
}
-static void d3d_effect_set_technique(d3d_effect *effect, const char *name)
+static void effect_set_technique(effect *effect, const char *name)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->SetTechnique(name);
}
-static void d3d_effect_set_vector(d3d_effect *effect, const char *name, int count, float *vector)
+static void effect_set_vector(effect *effect, const char *name, int count, float *vector)
{
static D3DXVECTOR4 out_vector;
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
@@ -733,54 +736,54 @@ static void d3d_effect_set_vector(d3d_effect *effect, const char *name, int coun
}
-static void d3d_effect_set_float(d3d_effect *effect, const char *name, float value)
+static void effect_set_float(effect *effect, const char *name, float value)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->SetFloat(name, value);
}
-static void d3d_effect_set_int(d3d_effect *effect, const char *name, int value)
+static void effect_set_int(effect *effect, const char *name, int value)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->SetInt(name, value);
}
-static void d3d_effect_set_matrix(d3d_effect *effect, const char *name, d3d_matrix *matrix)
+static void effect_set_matrix(effect *effect, const char *name, matrix *matrix)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->SetMatrix(name, (D3DXMATRIX*)matrix);
}
-static void d3d_effect_set_texture(d3d_effect *effect, const char *name, d3d_texture *tex)
+static void effect_set_texture(effect *effect, const char *name, texture *tex)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
d3dfx->SetTexture(name, (IDirect3DTexture9*)tex);
}
-static ULONG d3d_effect_release(d3d_effect *effect)
+static ULONG effect_release(effect *effect)
{
ID3DXEffect *d3dfx = (ID3DXEffect*)effect;
return d3dfx->Release();
}
-static const d3d_effect_interface d3d9_effect_interface =
+static const effect_interface d3d9_effect_interface =
{
- d3d_effect_begin,
- d3d_effect_end,
- d3d_effect_begin_pass,
- d3d_effect_end_pass,
- d3d_effect_set_technique,
- d3d_effect_set_vector,
- d3d_effect_set_float,
- d3d_effect_set_int,
- d3d_effect_set_matrix,
- d3d_effect_set_texture,
- d3d_effect_release
+ effect_begin,
+ effect_end,
+ effect_begin_pass,
+ effect_end_pass,
+ effect_set_technique,
+ effect_set_vector,
+ effect_set_float,
+ effect_set_int,
+ effect_set_matrix,
+ effect_set_texture,
+ effect_release
};
@@ -789,7 +792,7 @@ static const d3d_effect_interface d3d9_effect_interface =
// set_interfaces
//============================================================
-static void set_interfaces(d3d_base *d3dptr)
+static void set_interfaces(base *d3dptr)
{
d3dptr->d3d = d3d9_interface;
d3dptr->device = d3d9_device_interface;
@@ -798,3 +801,5 @@ static void set_interfaces(d3d_base *d3dptr)
d3dptr->vertexbuf = d3d9_vertex_buffer_interface;
d3dptr->effect = d3d9_effect_interface;
}
+
+};
diff --git a/src/osd/windows/d3dcomm.h b/src/osd/windows/d3dcomm.h
index 41318dc0822..4516784075a 100644
--- a/src/osd/windows/d3dcomm.h
+++ b/src/osd/windows/d3dcomm.h
@@ -43,56 +43,211 @@
#define __WIN_D3DCOMM__
//============================================================
-// CONSTANTS
+// FORWARD DECLARATIONS
//============================================================
+namespace d3d
+{
+class texture_info;
+class renderer;
//============================================================
// TYPE DEFINITIONS
//============================================================
-/* d3d_texture_info holds information about a texture */
-struct d3d_texture_info
+class vec2f
{
- d3d_texture_info * next; // next texture in the list
- d3d_texture_info * prev; // prev texture in the list
- UINT32 hash; // hash value for the texture
- UINT32 flags; // rendering flags
- render_texinfo texinfo; // copy of the texture info
- float ustart, ustop; // beginning/ending U coordinates
- float vstart, vstop; // beginning/ending V coordinates
- int rawwidth, rawheight; // raw width/height of the texture
- int type; // what type of texture are we?
- int xborderpix; // number of border pixels in X
- int yborderpix; // number of border pixels in Y
- int xprescale; // what is our X prescale factor?
- int yprescale; // what is our Y prescale factor?
- int cur_frame; // what is our current frame?
- int prev_frame; // what was our last frame? (used to determine pause state)
- d3d_texture * d3dtex; // Direct3D texture pointer
- d3d_surface * d3dsurface; // Direct3D offscreen plain surface pointer
- d3d_texture * d3dfinaltex; // Direct3D final (post-scaled) texture
- int target_index; // Direct3D target index
+public:
+ vec2f()
+ {
+ memset(&c, 0, sizeof(float) * 2);
+ }
+ vec2f(float x, float y)
+ {
+ c.x = x;
+ c.y = y;
+ }
+
+ vec2f operator+(const vec2f& a)
+ {
+ return vec2f(c.x + a.c.x, c.y + a.c.y);
+ }
+
+ vec2f operator-(const vec2f& a)
+ {
+ return vec2f(c.x - a.c.x, c.y - a.c.y);
+ }
+
+ struct
+ {
+ float x, y;
+ } c;
};
+class texture_manager
+{
+public:
+ texture_manager() { }
+ texture_manager(renderer *d3d);
+ ~texture_manager() { }
+
+ void update_textures();
+
+ void create_resources();
+ void delete_resources();
+
+ texture_info * find_texinfo(const render_texinfo *texture, UINT32 flags);
+ UINT32 texture_compute_hash(const render_texinfo *texture, UINT32 flags);
+
+ texture_info * get_texlist() { return m_texlist; }
+ void set_texlist(texture_info *texlist) { m_texlist = texlist; }
+ bool is_dynamic_supported() { return (bool)m_dynamic_supported; }
+ void set_dynamic_supported(bool dynamic_supported) { m_dynamic_supported = dynamic_supported; }
+ bool is_stretch_supported() { return (bool)m_stretch_supported; }
+ D3DFORMAT get_yuv_format() { return m_yuv_format; }
+
+ DWORD get_texture_caps() { return m_texture_caps; }
+ DWORD get_max_texture_aspect() { return m_texture_max_aspect; }
+ DWORD get_max_texture_width() { return m_texture_max_width; }
+ DWORD get_max_texture_height() { return m_texture_max_height; }
+
+ texture_info * get_default_texture() { return m_default_texture; }
+ texture_info * get_vector_texture() { return m_vector_texture; }
+
+ renderer * get_d3d() { return m_renderer; }
-/* d3d_poly_info holds information about a single polygon/d3d primitive */
-struct d3d_poly_info
+private:
+ renderer * m_renderer;
+
+ texture_info * m_texlist; // list of active textures
+ int m_dynamic_supported; // are dynamic textures supported?
+ int m_stretch_supported; // is StretchRect with point filtering supported?
+ D3DFORMAT m_yuv_format; // format to use for YUV textures
+
+ DWORD m_texture_caps; // textureCaps field
+ DWORD m_texture_max_aspect; // texture maximum aspect ratio
+ DWORD m_texture_max_width; // texture maximum width
+ DWORD m_texture_max_height; // texture maximum height
+
+ bitmap_argb32 m_vector_bitmap; // experimental: bitmap for vectors
+ texture_info * m_vector_texture; // experimental: texture for vectors
+
+ bitmap_rgb32 m_default_bitmap; // experimental: default bitmap
+ texture_info * m_default_texture; // experimental: default texture
+};
+
+
+/* texture_info holds information about a texture */
+class texture_info
{
- D3DPRIMITIVETYPE type; // type of primitive
- UINT32 count; // total number of primitives
- UINT32 numverts; // total number of vertices
- UINT32 flags; // rendering flags
- DWORD modmode; // texture modulation mode
- d3d_texture_info * texture; // pointer to texture info
- float line_time; // used by vectors
- float line_length; // used by vectors
+public:
+ texture_info(texture_manager *manager, const render_texinfo *texsource, UINT32 flags);
+ ~texture_info();
+
+ render_texinfo & get_texinfo() { return m_texinfo; }
+
+ int get_width() { return m_rawdims.c.x; }
+ int get_height() { return m_rawdims.c.y; }
+ int get_xscale() { return m_xprescale; }
+ int get_yscale() { return m_yprescale; }
+
+ UINT32 get_flags() { return m_flags; }
+
+ void set_data(const render_texinfo *texsource, UINT32 flags);
+
+ texture_info * get_next() { return m_next; }
+ texture_info * get_prev() { return m_prev; }
+
+ UINT32 get_hash() { return m_hash; }
+
+ void set_next(texture_info *next) { m_next = next; }
+ void set_prev(texture_info *prev) { m_prev = prev; }
+
+ bool paused() { return m_cur_frame == m_prev_frame; }
+ void advance_frame() { m_prev_frame = m_cur_frame; }
+ void increment_frame_count() { m_cur_frame++; }
+ void mask_frame_count(int mask) { m_cur_frame %= mask; }
+
+ int get_cur_frame() { return m_cur_frame; }
+ int get_prev_frame() { return m_prev_frame; }
+
+ texture * get_tex() { return m_d3dtex; }
+ surface * get_surface() { return m_d3dsurface; }
+ texture * get_finaltex() { return m_d3dfinaltex; }
+
+ vec2f & get_uvstart() { return m_start; }
+ vec2f & get_uvstop() { return m_stop; }
+ vec2f & get_rawdims() { return m_rawdims; }
+
+private:
+ void prescale();
+ void compute_size(int texwidth, int texheight);
+
+ texture_manager * m_texture_manager; // texture manager pointer
+
+ renderer * m_renderer; // renderer pointer
+
+ texture_info * m_next; // next texture in the list
+ texture_info * m_prev; // prev texture in the list
+
+ UINT32 m_hash; // hash value for the texture
+ UINT32 m_flags; // rendering flags
+ render_texinfo m_texinfo; // copy of the texture info
+ vec2f m_start; // beggining UV coordinates
+ vec2f m_stop; // ending UV coordinates
+ vec2f m_rawdims; // raw dims of the texture
+ int m_type; // what type of texture are we?
+ int m_xborderpix, m_yborderpix; // number of border pixels on X/Y
+ int m_xprescale, m_yprescale; // X/Y prescale factor
+ int m_cur_frame; // what is our current frame?
+ int m_prev_frame; // what was our last frame? (used to determine pause state)
+ texture * m_d3dtex; // Direct3D texture pointer
+ surface * m_d3dsurface; // Direct3D offscreen plain surface pointer
+ texture * m_d3dfinaltex; // Direct3D final (post-scaled) texture
+ int m_target_index; // Direct3D target index
+};
+
+/* d3d::poly_info holds information about a single polygon/d3d primitive */
+class poly_info
+{
+public:
+ poly_info() { }
+
+ void init(D3DPRIMITIVETYPE type, UINT32 count, UINT32 numverts,
+ UINT32 flags, d3d::texture_info *texture, UINT32 modmode);
+ void init(D3DPRIMITIVETYPE type, UINT32 count, UINT32 numverts,
+ UINT32 flags, d3d::texture_info *texture, UINT32 modmode,
+ float line_time, float line_length);
+
+ D3DPRIMITIVETYPE get_type() { return m_type; }
+ UINT32 get_count() { return m_count; }
+ UINT32 get_vertcount() { return m_numverts; }
+ UINT32 get_flags() { return m_flags; }
+
+ d3d::texture_info * get_texture() { return m_texture; }
+ DWORD get_modmode() { return m_modmode; }
+
+ float get_line_time() { return m_line_time; }
+ float get_line_length() { return m_line_length; }
+
+private:
+ D3DPRIMITIVETYPE m_type; // type of primitive
+ UINT32 m_count; // total number of primitives
+ UINT32 m_numverts; // total number of vertices
+ UINT32 m_flags; // rendering flags
+
+ texture_info * m_texture; // pointer to texture info
+ DWORD m_modmode; // texture modulation mode
+
+ float m_line_time; // used by vectors
+ float m_line_length; // used by vectors
};
+}; // d3d
-/* d3d_vertex describes a single vertex */
-struct d3d_vertex
+/* vertex describes a single vertex */
+struct vertex
{
float x, y, z; // X,Y,Z coordinates
float rhw; // RHW when no HLSL, padding when HLSL
diff --git a/src/osd/windows/d3dhlsl.c b/src/osd/windows/d3dhlsl.c
index 733725faa0b..8bca8f88f9d 100644
--- a/src/osd/windows/d3dhlsl.c
+++ b/src/osd/windows/d3dhlsl.c
@@ -83,7 +83,13 @@
// GLOBALS
//============================================================
-static hlsl_options g_hlsl_presets[4] =
+static slider_state *g_slider_list;
+static file_error open_next(d3d::renderer *d3d, emu_file &file, const char *templ, const char *extension, int idx);
+
+namespace d3d
+{
+
+hlsl_options shaders::s_hlsl_presets[4] =
{
{ // 25% Shadow mask, 50% Scanlines, 3% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation
true,
@@ -104,7 +110,9 @@ static hlsl_options g_hlsl_presets[4] =
{ 0.05f,0.05f,0.05f},
{ 0.25f,0.25f,0.25f},
1.2f,
- false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0
+ false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0,
+ 0.0f, 0.1f, 0.9f, 4.0f,
+ 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f
},
{ // 25% Shadow mask, 0% Scanlines, 3% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation
true,
@@ -125,7 +133,9 @@ static hlsl_options g_hlsl_presets[4] =
{ 0.05f,0.05f,0.05f},
{ 0.25f,0.25f,0.25f},
1.2f,
- false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0
+ false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0,
+ 0.0f, 0.1f, 0.9f, 4.0f,
+ 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f
},
{ // 25% Shadow mask, 0% Scanlines, 0% Pincushion, 0 defocus, No Tint, 0.9 Exponent, 5% Floor, 25% Phosphor Return, 120% Saturation
true,
@@ -146,7 +156,9 @@ static hlsl_options g_hlsl_presets[4] =
{ 0.05f,0.05f,0.05f},
{ 0.25f,0.25f,0.25f},
1.2f,
- false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0
+ false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0,
+ 0.0f, 0.1f, 0.9f, 4.0f,
+ 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f
},
{ // 25% Shadow mask, 100% Scanlines, 15% Pincushion, 3 defocus, 24-degree Tint Out, 1.5 Exponent, 5% Floor, 70% Phosphor Return, 80% Saturation, Bad Convergence
true,
@@ -167,28 +179,25 @@ static hlsl_options g_hlsl_presets[4] =
{ 0.05f,0.05f,0.05f},
{ 0.7f, 0.7f, 0.7f},
0.8f,
- false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0
+ false, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0,
+ 0.0f, 0.1f, 0.9f, 4.0f,
+ 1.0f, 0.21f, 0.19f, 0.17f, 0.15f, 0.14f, 0.13f, 0.12f, 0.11f, 0.10f, 0.09f
},
};
-static slider_state *g_slider_list;
-
-
-
//============================================================
// PROTOTYPES
//============================================================
static void get_vector(const char *data, int count, float *out, int report_error);
-static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, const char *extension, int idx);
//============================================================
-// hlsl_info constructor
+// shader manager constructor
//============================================================
-hlsl_info::hlsl_info()
+shaders::shaders()
{
master_enable = false;
vector_enable = true;
@@ -209,10 +218,10 @@ hlsl_info::hlsl_info()
//============================================================
-// hlsl_info destructor
+// shaders destructor
//============================================================
-hlsl_info::~hlsl_info()
+shaders::~shaders()
{
global_free(options);
}
@@ -220,17 +229,17 @@ hlsl_info::~hlsl_info()
//============================================================
-// hlsl_info::window_save
+// shaders::window_save
//============================================================
-void hlsl_info::window_save()
+void shaders::window_save()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- HRESULT result = (*d3dintf->device.create_texture)(d3d->device, snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture);
+ HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &snap_copy_texture);
if (result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to init system-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result);
@@ -238,7 +247,7 @@ void hlsl_info::window_save()
}
(*d3dintf->texture.get_surface_level)(snap_copy_texture, 0, &snap_copy_target);
- result = (*d3dintf->device.create_texture)(d3d->device, snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), snap_width, snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &snap_texture);
if (result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to init video-memory target for HLSL snapshot (%08x), bailing\n", (UINT32)result);
@@ -253,10 +262,10 @@ void hlsl_info::window_save()
//============================================================
-// hlsl_info::window_record
+// shaders::window_record
//============================================================
-void hlsl_info::window_record()
+void shaders::window_record()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
@@ -272,15 +281,15 @@ void hlsl_info::window_record()
//============================================================
-// hlsl_info::avi_update_snap
+// shaders::avi_update_snap
//============================================================
-void hlsl_info::avi_update_snap(d3d_surface *surface)
+void shaders::avi_update_snap(surface *surface)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
D3DLOCKED_RECT rect;
@@ -291,7 +300,7 @@ void hlsl_info::avi_update_snap(d3d_surface *surface)
}
// copy the texture
- HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, avi_copy_surface);
+ HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, avi_copy_surface);
if (result != D3D_OK)
{
return;
@@ -325,12 +334,12 @@ void hlsl_info::avi_update_snap(d3d_surface *surface)
// hlsl_render_snapshot
//============================================================
-void hlsl_info::render_snapshot(d3d_surface *surface)
+void shaders::render_snapshot(surface *surface)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
D3DLOCKED_RECT rect;
@@ -343,7 +352,7 @@ void hlsl_info::render_snapshot(d3d_surface *surface)
}
// copy the texture
- HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->device, surface, snap_copy_target);
+ HRESULT result = (*d3dintf->device.get_render_target_data)(d3d->get_device(), surface, snap_copy_target);
if (result != D3D_OK)
{
return;
@@ -427,15 +436,15 @@ void hlsl_info::render_snapshot(d3d_surface *surface)
//============================================================
-// hlsl_info::record_texture
+// shaders::record_texture
//============================================================
-void hlsl_info::record_texture()
+void shaders::record_texture()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_surface *surface = avi_final_target;
+ surface *surface = avi_final_target;
// ignore if nothing to do
if (avi_output_file == NULL || surface == NULL)
@@ -466,10 +475,10 @@ void hlsl_info::record_texture()
//============================================================
-// hlsl_info::end_hlsl_avi_recording
+// shaders::end_hlsl_avi_recording
//============================================================
-void hlsl_info::end_avi_recording()
+void shaders::end_avi_recording()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
@@ -483,10 +492,10 @@ void hlsl_info::end_avi_recording()
//============================================================
-// hlsl_info::set_texture
+// shaders::set_texture
//============================================================
-void hlsl_info::toggle()
+void shaders::toggle()
{
if (master_enable)
{
@@ -515,15 +524,15 @@ void hlsl_info::toggle()
}
//============================================================
-// hlsl_info::begin_avi_recording
+// shaders::begin_avi_recording
//============================================================
-void hlsl_info::begin_avi_recording(const char *name)
+void shaders::begin_avi_recording(const char *name)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
// stop any existing recording
end_avi_recording();
@@ -593,7 +602,7 @@ void hlsl_info::begin_avi_recording(const char *name)
// refcount hits zero
//============================================================
-void hlsl_info::remove_cache_target(d3d_cache_target *cache)
+void shaders::remove_cache_target(cache_target *cache)
{
if (cache != NULL)
{
@@ -621,21 +630,21 @@ void hlsl_info::remove_cache_target(d3d_cache_target *cache)
// remove_render_target - remove an active target
//============================================================
-void hlsl_info::remove_render_target(d3d_texture_info *texture)
+void shaders::remove_render_target(texture_info *texture)
{
remove_render_target(find_render_target(texture));
}
-void hlsl_info::remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index)
+void shaders::remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index)
{
- d3d_render_target *target = find_render_target(width, height, screen_index, page_index);
+ render_target *target = find_render_target(width, height, screen_index, page_index);
if (target != NULL)
{
remove_render_target(target);
}
}
-void hlsl_info::remove_render_target(d3d_render_target *rt)
+void shaders::remove_render_target(render_target *rt)
{
if (rt != NULL)
{
@@ -654,7 +663,7 @@ void hlsl_info::remove_render_target(d3d_render_target *rt)
rt->next->prev = rt->prev;
}
- d3d_cache_target *cache = find_cache_target(rt->screen_index, rt->width, rt->height);
+ cache_target *cache = find_cache_target(rt->screen_index, rt->width, rt->height);
if (cache != NULL)
{
remove_cache_target(cache);
@@ -674,44 +683,37 @@ void hlsl_info::remove_render_target(d3d_render_target *rt)
//============================================================
-// hlsl_info::set_texture
+// shaders::set_texture
//============================================================
-void hlsl_info::set_texture(d3d_texture_info *texture)
+void shaders::set_texture(texture_info *texture)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
if(texture != NULL)
{
- if(texture->prev_frame == texture->cur_frame)
- {
- paused = true;
- }
- else
- {
- paused = false;
- }
-
- texture->prev_frame = texture->cur_frame;
+ paused = texture->paused();
+ texture->advance_frame();
}
- (*d3dintf->effect.set_texture)(effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
+ texture_info *default_texture = d3d->get_default_texture();
+ (*d3dintf->effect.set_texture)(default_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex());
if (options->yiq_enable)
- (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
+ (*d3dintf->effect.set_texture)(yiq_encode_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex());
else
- (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
- (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
+ (*d3dintf->effect.set_texture)(color_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex());
+ (*d3dintf->effect.set_texture)(pincushion_effect, "Diffuse", (texture == NULL) ? default_texture->get_finaltex() : texture->get_finaltex());
}
//============================================================
-// hlsl_info::init
+// shaders::init
//============================================================
-void hlsl_info::init(d3d_base *d3dintf, win_window_info *window)
+void shaders::init(base *d3dintf, win_window_info *window)
{
if (!d3dintf->post_fx_available)
return;
@@ -746,7 +748,7 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window)
if(read_ini)
{
emu_file ini_file(downcast<windows_options &>(window->machine().options()).screen_post_fx_dir(), OPEN_FLAG_READ | OPEN_FLAG_CREATE_PATHS);
- file_error filerr = open_next((d3d_info*)window->drawdata, ini_file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0);
+ file_error filerr = open_next((renderer*)window->drawdata, ini_file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0);
read_ini = false;
if (filerr == FILERR_NONE)
@@ -962,7 +964,7 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window)
}
else
{
- options = &g_hlsl_presets[preset];
+ options = &s_hlsl_presets[preset];
}
options->yiq_enable = winoptions.screen_yiq_enable();
@@ -981,6 +983,17 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window)
options->vector_time_period = winoptions.screen_vector_time_period();
options->vector_length_scale = winoptions.screen_vector_length_scale();
options->vector_length_ratio = winoptions.screen_vector_length_ratio();
+ options->bloom_level0_weight = winoptions.screen_bloom_lvl0_weight();
+ options->bloom_level1_weight = winoptions.screen_bloom_lvl1_weight();
+ options->bloom_level2_weight = winoptions.screen_bloom_lvl2_weight();
+ options->bloom_level3_weight = winoptions.screen_bloom_lvl3_weight();
+ options->bloom_level4_weight = winoptions.screen_bloom_lvl4_weight();
+ options->bloom_level5_weight = winoptions.screen_bloom_lvl5_weight();
+ options->bloom_level6_weight = winoptions.screen_bloom_lvl6_weight();
+ options->bloom_level7_weight = winoptions.screen_bloom_lvl7_weight();
+ options->bloom_level8_weight = winoptions.screen_bloom_lvl8_weight();
+ options->bloom_level9_weight = winoptions.screen_bloom_lvl9_weight();
+ options->bloom_level10_weight = winoptions.screen_bloom_lvl10_weight();
}
options->params_dirty = true;
@@ -996,10 +1009,10 @@ void hlsl_info::init(d3d_base *d3dintf, win_window_info *window)
//============================================================
-// hlsl_info::init_fsfx_quad
+// shaders::init_fsfx_quad
//============================================================
-void hlsl_info::init_fsfx_quad(void *vertbuf)
+void shaders::init_fsfx_quad(void *vertbuf)
{
// Called at the start of each frame by the D3D code in order to reserve two triangles
// that are guaranteed to be at a fixed position so as to simply use D3DPT_TRIANGLELIST, 0, 2
@@ -1007,26 +1020,26 @@ void hlsl_info::init_fsfx_quad(void *vertbuf)
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
// get a pointer to the vertex buffer
- fsfx_vertices = (d3d_vertex *)vertbuf;
+ fsfx_vertices = (vertex *)vertbuf;
if (fsfx_vertices == NULL)
return;
// fill in the vertexes clockwise
fsfx_vertices[0].x = 0.0f;
fsfx_vertices[0].y = 0.0f;
- fsfx_vertices[1].x = d3d->width;
+ fsfx_vertices[1].x = d3d->get_width();
fsfx_vertices[1].y = 0.0f;
fsfx_vertices[2].x = 0.0f;
- fsfx_vertices[2].y = d3d->height;
- fsfx_vertices[3].x = d3d->width;
+ fsfx_vertices[2].y = d3d->get_height();
+ fsfx_vertices[3].x = d3d->get_width();
fsfx_vertices[3].y = 0.0f;
fsfx_vertices[4].x = 0.0f;
- fsfx_vertices[4].y = d3d->height;
- fsfx_vertices[5].x = d3d->width;
- fsfx_vertices[5].y = d3d->height;
+ fsfx_vertices[4].y = d3d->get_height();
+ fsfx_vertices[5].x = d3d->get_width();
+ fsfx_vertices[5].y = d3d->get_height();
fsfx_vertices[0].u0 = 0.0f;
fsfx_vertices[0].v0 = 0.0f;
@@ -1058,34 +1071,34 @@ void hlsl_info::init_fsfx_quad(void *vertbuf)
//============================================================
-// hlsl_info::create_resources
+// shaders::create_resources
//============================================================
-int hlsl_info::create_resources(bool reset)
+int shaders::create_resources(bool reset)
{
if (!master_enable || !d3dintf->post_fx_available)
return 0;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- HRESULT result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer);
+ HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result);
- result = (*d3dintf->device.create_texture)(d3d->device, 4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), 4, 4, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &black_texture);
if (result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to init video-memory target for black texture (%08x)\n", (UINT32)result);
return 1;
}
(*d3dintf->texture.get_surface_level)(black_texture, 0, &black_surface);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, black_surface);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, black_surface);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.create_texture)(d3d->device, (int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &avi_copy_texture);
if (result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to init system-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result);
@@ -1093,7 +1106,7 @@ int hlsl_info::create_resources(bool reset)
}
(*d3dintf->texture.get_surface_level)(avi_copy_texture, 0, &avi_copy_surface);
- result = (*d3dintf->device.create_texture)(d3d->device, (int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), (int)snap_width, (int)snap_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &avi_final_texture);
if (result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to init video-memory target for HLSL AVI dumping (%08x)\n", (UINT32)result);
@@ -1115,7 +1128,7 @@ int hlsl_info::create_resources(bool reset)
texture.seqid = 0;
// now create it
- shadow_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32));
+ shadow_texture = new texture_info(d3d->get_texture_manager(), &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32));
}
const char *fx_dir = downcast<windows_options &>(window->machine().options()).screen_post_fx_dir();
@@ -1162,7 +1175,7 @@ int hlsl_info::create_resources(bool reset)
TCHAR *yiq_decode_name = tstring_from_utf8(yiq_decode_name_cstr);
// create the regular shader
- result = (*d3dintf->device.create_effect)(d3d->device, primary_name, &effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), primary_name, &default_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load primary.fx\n");
@@ -1170,7 +1183,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the post-processing shader
- result = (*d3dintf->device.create_effect)(d3d->device, post_name, &post_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), post_name, &post_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load post.fx\n");
@@ -1178,7 +1191,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the prescaling shader
- result = (*d3dintf->device.create_effect)(d3d->device, prescale_name, &prescale_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), prescale_name, &prescale_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load prescale.fx\n");
@@ -1186,7 +1199,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the pincushion shader
- result = (*d3dintf->device.create_effect)(d3d->device, pincushion_name, &pincushion_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), pincushion_name, &pincushion_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load pincushion.fx\n");
@@ -1194,7 +1207,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the phosphor shader
- result = (*d3dintf->device.create_effect)(d3d->device, phosphor_name, &phosphor_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), phosphor_name, &phosphor_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load phosphor.fx\n");
@@ -1202,7 +1215,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the focus shader
- result = (*d3dintf->device.create_effect)(d3d->device, focus_name, &focus_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), focus_name, &focus_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load focus.fx\n");
@@ -1210,7 +1223,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the deconvergence shader
- result = (*d3dintf->device.create_effect)(d3d->device, deconverge_name, &deconverge_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), deconverge_name, &deconverge_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load deconverge.fx\n");
@@ -1218,7 +1231,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the color convolution shader
- result = (*d3dintf->device.create_effect)(d3d->device, color_name, &color_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), color_name, &color_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load color.fx\n");
@@ -1226,7 +1239,7 @@ int hlsl_info::create_resources(bool reset)
}
// create the YIQ modulation shader
- result = (*d3dintf->device.create_effect)(d3d->device, yiq_encode_name, &yiq_encode_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), yiq_encode_name, &yiq_encode_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load yiq_encode.fx\n");
@@ -1234,20 +1247,19 @@ int hlsl_info::create_resources(bool reset)
}
// create the YIQ demodulation shader
- result = (*d3dintf->device.create_effect)(d3d->device, yiq_decode_name, &yiq_decode_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), yiq_decode_name, &yiq_decode_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load yiq_decode.fx\n");
return 1;
}
- // create the vector shader
-#if HLSL_VECTOR
+#if HLSL_VECTOR || CRT_BLOOM
char bloom_cstr[1024];
sprintf(bloom_cstr, "%s\\bloom.fx", fx_dir);
TCHAR *bloom_name = tstring_from_utf8(bloom_cstr);
- result = (*d3dintf->device.create_effect)(d3d->device, bloom_name, &bloom_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), bloom_name, &bloom_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load bloom.fx\n");
@@ -1260,7 +1272,7 @@ int hlsl_info::create_resources(bool reset)
sprintf(downsample_cstr, "%s\\downsample.fx", fx_dir);
TCHAR *downsample_name = tstring_from_utf8(downsample_cstr);
- result = (*d3dintf->device.create_effect)(d3d->device, downsample_name, &downsample_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), downsample_name, &downsample_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load downsample.fx\n");
@@ -1268,12 +1280,14 @@ int hlsl_info::create_resources(bool reset)
}
if (downsample_name)
osd_free(downsample_name);
-
+#endif
+#if HLSL_VECTOR
+ // create the vector shader
char vector_cstr[1024];
sprintf(vector_cstr, "%s\\vector.fx", fx_dir);
TCHAR *vector_name = tstring_from_utf8(vector_cstr);
- result = (*d3dintf->device.create_effect)(d3d->device, vector_name, &vector_effect);
+ result = (*d3dintf->device.create_effect)(d3d->get_device(), vector_name, &vector_effect);
if(result != D3D_OK)
{
mame_printf_verbose("Direct3D: Unable to load vector.fx\n");
@@ -1311,19 +1325,19 @@ int hlsl_info::create_resources(bool reset)
//============================================================
-// hlsl_info::begin_draw
+// shaders::begin_draw
//============================================================
-void hlsl_info::begin_draw()
+void shaders::begin_draw()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- curr_effect = effect;
+ curr_effect = default_effect;
- (*d3dintf->effect.set_technique)(effect, "TestTechnique");
+ (*d3dintf->effect.set_technique)(default_effect, "TestTechnique");
(*d3dintf->effect.set_technique)(post_effect, "ScanMaskTechnique");
(*d3dintf->effect.set_technique)(pincushion_effect, "TestTechnique");
(*d3dintf->effect.set_technique)(phosphor_effect, "TestTechnique");
@@ -1333,49 +1347,34 @@ void hlsl_info::begin_draw()
(*d3dintf->effect.set_technique)(yiq_encode_effect, "EncodeTechnique");
(*d3dintf->effect.set_technique)(yiq_decode_effect, "DecodeTechnique");
- HRESULT result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer);
+ HRESULT result = (*d3dintf->device.get_render_target)(d3d->get_device(), 0, &backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result);
}
//============================================================
-// hlsl_info::begin_frame
+// shaders::begin_frame
//============================================================
-void hlsl_info::begin_frame()
+void shaders::begin_frame()
{
record_texture();
-
- /*d3d_info *d3d = (d3d_info *)window->drawdata;
-
- d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
- if (rt == NULL)
- {
- return;
- }
-
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);*/
}
//============================================================
-// hlsl_info::blit
+// shaders::blit
//============================================================
-void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D3DPRIMITIVETYPE prim_type,
+void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type,
UINT32 prim_index, UINT32 prim_count, int dstw, int dsth)
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, dst);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- curr_effect = effect;
+ curr_effect = default_effect;
(*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src);
@@ -1392,7 +1391,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, prim_type, prim_index, prim_count);
+ HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1401,7 +1400,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D
if (new_dst)
{
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, new_dst);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, new_dst);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
}
}
@@ -1409,31 +1408,27 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D
//============================================================
-// hlsl_info::blit
+// shaders::blit
//============================================================
-void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D3DPRIMITIVETYPE prim_type,
+void shaders::blit(surface *dst, texture *src, surface *new_dst, D3DPRIMITIVETYPE prim_type,
UINT32 prim_index, UINT32 prim_count)
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, dst);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, dst);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- curr_effect = effect;
-
- d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
- if (rt == NULL)
- {
- return;
- }
+ curr_effect = default_effect;
(*d3dintf->effect.set_texture)(curr_effect, "Diffuse", src);
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "ScreenWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "ScreenHeight", (float)d3d->height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
+ (*d3dintf->effect.set_float)(curr_effect, "ScreenWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "ScreenHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "PostPass", 1.0f);
(*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion);
(*d3dintf->effect.set_float)(curr_effect, "Brighten", 1.0f);
@@ -1445,7 +1440,7 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, prim_type, prim_index, prim_count);
+ HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), prim_type, prim_index, prim_count);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1456,16 +1451,16 @@ void hlsl_info::blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst, D
if (new_dst)
{
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, new_dst);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, new_dst);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
}
}
//============================================================
-// hlsl_info::end_frame
+// shaders::end_frame
//============================================================
-void hlsl_info::end_frame()
+void shaders::end_frame()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
@@ -1479,89 +1474,94 @@ void hlsl_info::end_frame()
return;
lines_pending = false;
- /*d3d_info *d3d = (d3d_info *)window->drawdata;
-
- d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
- if (!rt)
- return;
-
- blit(backbuffer, rt->texture[0], NULL, vecbuf_type, vecbuf_index, vecbuf_count);*/
- /*d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
+ /*render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
if (rt == NULL)
{
return;
}
- blit(backbuffer, rt->texture[1], NULL, vecbuf_type, vecbuf_index, vecbuf_count);
+ blit(backbuffer, rt->render_texture[1], NULL, vecbuf_type, vecbuf_index, vecbuf_count);
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);*/
}
//============================================================
-// hlsl_info::init_effect_info
+// shaders::init_effect_info
//============================================================
-void hlsl_info::init_effect_info(d3d_poly_info *poly)
+void shaders::init_effect_info(poly_info *poly)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
+ texture_info *texture = poly->get_texture();
- if(PRIMFLAG_GET_TEXSHADE(d3d->last_texture_flags))
+ vec2f shadow_dims;
+
+ if (shadow_texture)
+ {
+ shadow_dims = shadow_texture->get_rawdims();
+ }
+ else
+ {
+ shadow_dims.c.x = 1.0f;
+ shadow_dims.c.y = 1.0f;
+ }
+
+ if(PRIMFLAG_GET_TEXSHADE(d3d->get_last_texture_flags()))
{
curr_effect = pincushion_effect;
}
- else if(PRIMFLAG_GET_SCREENTEX(d3d->last_texture_flags) && poly->texture != NULL)
+ else if(PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && texture != NULL)
{
// Plug in all of the shader settings we're going to need
// This is extremely slow, but we're not rendering models here,
// just post-processing.
curr_effect = post_effect;
- (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset);
+ (*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset);
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", d3d->height);
+ vec2f delta = texture->get_uvstop() - texture->get_uvstart();
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &texture->get_rawdims().c.x);
+ (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", d3d->get_height());
(*d3dintf->effect.set_vector)(curr_effect, "Floor", 3, options->floor);
(*d3dintf->effect.set_float)(curr_effect, "SnapX", snap_width);
(*d3dintf->effect.set_float)(curr_effect, "SnapY", snap_height);
(*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion);
(*d3dintf->effect.set_float)(curr_effect, "CurvatureAmount", options->curvature);
(*d3dintf->effect.set_float)(curr_effect, "UseShadow", shadow_texture == NULL ? 0.0f : 1.0f);
- (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->d3dfinaltex);
+ (*d3dintf->effect.set_texture)(curr_effect, "Shadow", shadow_texture == NULL ? NULL : shadow_texture->get_finaltex());
(*d3dintf->effect.set_float)(curr_effect, "ShadowBrightness", options->shadow_mask_alpha);
(*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeX", (float)options->shadow_mask_count_x);
(*d3dintf->effect.set_float)(curr_effect, "ShadowMaskSizeY", (float)options->shadow_mask_count_y);
(*d3dintf->effect.set_float)(curr_effect, "ShadowU", options->shadow_mask_u_size);
(*d3dintf->effect.set_float)(curr_effect, "ShadowV", options->shadow_mask_v_size);
- (*d3dintf->effect.set_float)(curr_effect, "ShadowWidth", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "ShadowHeight", shadow_texture == NULL ? 1.0f : (float)shadow_texture->rawheight);
+
+ (*d3dintf->effect.set_vector)(curr_effect, "ShadowDims", 2, &shadow_dims.c.x);
(*d3dintf->effect.set_float)(curr_effect, "ScanlineAmount", options->scanline_alpha);
(*d3dintf->effect.set_float)(curr_effect, "ScanlineScale", options->scanline_scale);
(*d3dintf->effect.set_float)(curr_effect, "ScanlineHeight", options->scanline_height);
(*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightScale", options->scanline_bright_scale);
(*d3dintf->effect.set_float)(curr_effect, "ScanlineBrightOffset", options->scanline_bright_offset);
- //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (poly->texture->cur_frame == 0) ? 0.0f : options->scanline_offset);
+ //(*d3dintf->effect.set_float)(curr_effect, "ScanlineOffset", (texture->get_cur_frame() == 0) ? 0.0f : options->scanline_offset);
(*d3dintf->effect.set_vector)(curr_effect, "Power", 3, options->power);
}
}
else
{
- curr_effect = effect;
+ curr_effect = default_effect;
(*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f);
}
@@ -1569,18 +1569,18 @@ void hlsl_info::init_effect_info(d3d_poly_info *poly)
//============================================================
-// hlsl_info::find_render_target
+// shaders::find_render_target
//============================================================
-d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info)
+render_target* shaders::find_render_target(texture_info *info)
{
- d3d_render_target *curr = targethead;
-
- UINT32 screen_index_data = (UINT32)info->texinfo.osddata;
+ render_target *curr = targethead;
+ UINT32 screen_index_data = (UINT32)info->get_texinfo().osddata;
UINT32 screen_index = screen_index_data >> 1;
UINT32 page_index = screen_index_data & 1;
- while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index || curr->width != info->texinfo.width || curr->height != info->texinfo.height))
+ while (curr != NULL && (curr->screen_index != screen_index || curr->page_index != page_index ||
+ curr->width != info->get_texinfo().width || curr->height != info->get_texinfo().height))
{
curr = curr->next;
}
@@ -1590,12 +1590,12 @@ d3d_render_target* hlsl_info::find_render_target(d3d_texture_info *info)
//============================================================
-// hlsl_info::find_render_target
+// shaders::find_render_target
//============================================================
-d3d_render_target* hlsl_info::find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index)
+render_target* shaders::find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index)
{
- d3d_render_target *curr = targethead;
+ render_target *curr = targethead;
while (curr != NULL && (curr->width != width || curr->height != height || curr->screen_index != screen_index || curr->page_index != page_index))
{
@@ -1607,12 +1607,12 @@ d3d_render_target* hlsl_info::find_render_target(int width, int height, UINT32 s
//============================================================
-// hlsl_info::find_cache_target
+// shaders::find_cache_target
//============================================================
-d3d_cache_target* hlsl_info::find_cache_target(UINT32 screen_index, int width, int height)
+cache_target* shaders::find_cache_target(UINT32 screen_index, int width, int height)
{
- d3d_cache_target *curr = cachehead;
+ cache_target *curr = cachehead;
while (curr != NULL && (curr->screen_index != screen_index || curr->width != width || curr->height != height))
{
@@ -1624,42 +1624,44 @@ d3d_cache_target* hlsl_info::find_cache_target(UINT32 screen_index, int width, i
//============================================================
-// hlsl_info::render_quad
+// shaders::render_quad
//============================================================
-void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
+void shaders::render_quad(poly_info *poly, int vertnum)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
UINT num_passes = 0;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
+ texture_info *texture = poly->get_texture();
- if(PRIMFLAG_GET_SCREENTEX(d3d->last_texture_flags) && poly->texture != NULL)
+ if(PRIMFLAG_GET_SCREENTEX(d3d->get_last_texture_flags()) && texture != NULL)
{
- d3d_render_target *rt = find_render_target(poly->texture);
+ render_target *rt = find_render_target(texture);
if (rt == NULL)
{
return;
}
- d3d_cache_target *ct = find_cache_target(rt->screen_index, poly->texture->texinfo.width, poly->texture->texinfo.height);
+ cache_target *ct = find_cache_target(rt->screen_index, texture->get_texinfo().width, texture->get_texinfo().height);
+
+ vec2f& rawdims = texture->get_rawdims();
+ vec2f delta = texture->get_uvstop() - texture->get_uvstart();
if(options->yiq_enable)
{
- /* Convert our signal into YIQ */
+ // Convert our signal into YIQ
curr_effect = yiq_encode_effect;
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
+ (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc);
(*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a);
- (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b));
+ (*d3dintf->effect.set_float)(curr_effect, "BValue", (texture->get_cur_frame() == 2) ? 0.0f : ((float)texture->get_cur_frame() * options->yiq_b));
(*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p);
(*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n);
(*d3dintf->effect.set_float)(curr_effect, "YFreqResponse", options->yiq_y);
@@ -1668,10 +1670,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time);
}
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[4]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[4]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1680,29 +1682,27 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- /* Convert our signal from YIQ */
+ // Convert our signal from YIQ
curr_effect = yiq_decode_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->texture[4]);
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", poly->texture->d3dfinaltex);
+ (*d3dintf->effect.set_texture)(curr_effect, "Composite", rt->render_texture[4]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", texture->get_finaltex());
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
+ (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "CCValue", options->yiq_cc);
(*d3dintf->effect.set_float)(curr_effect, "AValue", options->yiq_a);
- (*d3dintf->effect.set_float)(curr_effect, "BValue", (poly->texture->cur_frame == 2) ? 0.0f : ((float)poly->texture->cur_frame * options->yiq_b));
+ (*d3dintf->effect.set_float)(curr_effect, "BValue", (texture->get_cur_frame() == 2) ? 0.0f : ((float)texture->get_cur_frame() * options->yiq_b));
(*d3dintf->effect.set_float)(curr_effect, "OValue", options->yiq_o);
(*d3dintf->effect.set_float)(curr_effect, "PValue", options->yiq_p);
(*d3dintf->effect.set_float)(curr_effect, "NotchHalfWidth", options->yiq_n);
@@ -1712,10 +1712,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.set_float)(curr_effect, "ScanTime", options->yiq_scan_time);
}
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[3]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[3]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1724,7 +1724,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1733,20 +1733,17 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
curr_effect = color_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[3]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[3]);
}
curr_effect = color_effect;
- /* Render the initial color-convolution pass */
+ // Render the initial color-convolution pass
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->ustop - poly->texture->ustart)));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", options->yiq_enable ? 1.0f : (1.0f / (poly->texture->vstop - poly->texture->vstart)));
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "YIQEnable", options->yiq_enable ? 1.0f : 0.0f);
(*d3dintf->effect.set_vector)(curr_effect, "RedRatios", 3, options->red_ratio);
(*d3dintf->effect.set_vector)(curr_effect, "GrnRatios", 3, options->grn_ratio);
@@ -1756,10 +1753,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.set_float)(curr_effect, "Saturation", options->saturation);
}
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->smalltarget);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->smalltarget);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1768,57 +1765,52 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- /* Pre-scaling pass */
+ // Pre-scaling pass
curr_effect = prescale_effect;
(*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->smalltexture);
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
}
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->prescaletarget);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->prescaletarget);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- /* Deconverge pass */
+ // Deconverge pass
curr_effect = deconverge_effect;
(*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->prescaletexture);
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
+ (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x);
(*d3dintf->effect.set_vector)(curr_effect, "ConvergeX", 3, options->converge_x);
(*d3dintf->effect.set_vector)(curr_effect, "ConvergeY", 3, options->converge_y);
(*d3dintf->effect.set_vector)(curr_effect, "RadialConvergeX", 3, options->radial_converge_x);
@@ -1827,16 +1819,16 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[2]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1848,59 +1840,51 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
bool focus_enable = defocus_x != 0.0f || defocus_y != 0.0f;
if(focus_enable)
{
- /* Defocus pass 1 */
+ // Defocus pass 1
curr_effect = focus_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[2]);
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[0]);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- /* Defocus pass 2 */
+ // Defocus pass 2
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f);
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_vector)(curr_effect, "Defocus", 2, &options->defocus[1]);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 7\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1915,24 +1899,22 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
+ //(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)rt->target_width);
+ //(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)rt->target_height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor);
}
(*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)rt->target_width);
(*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)rt->target_height);
(*d3dintf->effect.set_float)(curr_effect, "Passthrough", 0.0f);
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? rt->texture[1] : rt->texture[2]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", focus_enable ? rt->render_texture[1] : rt->render_texture[2]);
(*d3dintf->effect.set_texture)(curr_effect, "LastPass", ct->last_texture);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 4\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1941,23 +1923,28 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- /* Pass along our phosphor'd screen */
+ // Pass along our phosphor'd screen
curr_effect = phosphor_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
- (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->texture[0]);
+ //(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ //(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
+ //(*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->get_width());
+ //(*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->get_height());
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->render_texture[0]);
(*d3dintf->effect.set_float)(curr_effect, "Passthrough", 1.0f);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, ct->last_target); // Avoid changing targets due to page flipping
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, ct->last_target); // Avoid changing targets due to page flipping
+ //result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer); // Avoid changing targets due to page flipping
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 5\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1966,7 +1953,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -1974,15 +1961,15 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.end)(curr_effect);
curr_effect = post_effect;
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
- /* Scanlines and shadow mask, at high res for AVI logging*/
+ // Scanlines and shadow mask, at high res for AVI logging
if(avi_output_file != NULL)
{
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, avi_final_target);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, avi_final_target);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -1991,7 +1978,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2001,9 +1988,9 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
if(render_snap)
{
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, snap_target);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, snap_target);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -2012,7 +1999,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2022,18 +2009,32 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
snap_rendered = true;
}
- /* Scanlines and shadow mask */
+ // Scanlines and shadow mask
curr_effect = post_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
+ //float raw_dims[2] = { d3d->get_width(), d3d->get_height() };
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
+ (*d3dintf->effect.set_vector)(curr_effect, "RawDims", 2, &rawdims.c.x);
+ (*d3dintf->effect.set_vector)(curr_effect, "SizeRatio", 2, &delta.c.x);
+ d3d->set_wrap(D3DTADDRESS_MIRROR);
+
+#if CRT_BLOOM
//(*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)rt->target_width);
//(*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)rt->target_height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
-#if HLSL_VECTOR
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[2]);
+
+ d3d->set_wrap(D3DTADDRESS_MIRROR);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(1,0,0,0), 0, 0);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
#else
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
+
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
#endif
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
@@ -2043,23 +2044,25 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
-#if HLSL_VECTOR
- /* Bloom */
+ d3d->set_wrap(PRIMFLAG_GET_TEXWRAP(poly->get_texture()->get_flags()) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+
+#if CRT_BLOOM
+ // Bloom
curr_effect = downsample_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[1]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[2]);
- int bloom_size = (rt->target_width < rt->target_height) ? rt->target_width : rt->target_height;
+ int bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height();
int bloom_index = 0;
- int bloom_width = rt->target_width;
- int bloom_height = rt->target_height;
+ int bloom_width = d3d->get_width();
+ int bloom_height = d3d->get_height();
for(; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
{
float source_size[2] = { bloom_width, bloom_height };
@@ -2069,24 +2072,19 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->texture[1] : ct->bloom_texture[bloom_index - 1]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->render_texture[2] : rt->bloom_texture[bloom_index - 1]);
- if (ct->bloom_target[bloom_index] == NULL)
- {
- (*d3dintf->effect.end)(curr_effect);
- break;
- }
-
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, ct->bloom_target[bloom_index]);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 7:%d\n", (int)result, bloom_size);
- //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->bloom_target[bloom_index]);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
+ //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
//if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
+ //result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2098,13 +2096,23 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
bloom_height >>= 1;
}
- /* Bloom composite pass*/
+ // Bloom composite pass
curr_effect = bloom_effect;
- float target_size[2] = { rt->target_width, rt->target_height };
+ float target_size[2] = { d3d->get_width(), d3d->get_height() };
+ (*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size);
+ float weight0123[4] = { options->bloom_level0_weight, options->bloom_level1_weight,
+ options->bloom_level2_weight, options->bloom_level3_weight };
+ float weight4567[4] = { options->bloom_level4_weight, options->bloom_level5_weight,
+ options->bloom_level6_weight, options->bloom_level7_weight };
+ float weight89A[3] = { options->bloom_level8_weight, options->bloom_level9_weight,
+ options->bloom_level10_weight };
+ (*d3dintf->effect.set_vector)(curr_effect, "Level0123Weight", 4, weight0123);
+ (*d3dintf->effect.set_vector)(curr_effect, "Level4567Weight", 4, weight4567);
+ (*d3dintf->effect.set_vector)(curr_effect, "Level89AWeight", 3, weight89A);
(*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size);
- (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->texture[1]);
+ (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->render_texture[2]);
(*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f);
char name[9] = "Diffuse*";
@@ -2113,7 +2121,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
name[7] = 'A' + index;
scale[12] = 'A' + index;
- (*d3dintf->effect.set_texture)(curr_effect, name, ct->bloom_texture[index - 1]);
+ (*d3dintf->effect.set_texture)(curr_effect, name, rt->bloom_texture[index - 1]);
(*d3dintf->effect.set_float)(curr_effect, scale, 1.0f);
}
for(int index = bloom_index; index < 11; index++)
@@ -2126,63 +2134,34 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[2]);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 8\n", (int)result);
-
- for (UINT pass = 0; pass < num_passes; pass++)
- {
- (*d3dintf->effect.begin_pass)(curr_effect, pass);
- // add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
- (*d3dintf->effect.end_pass)(curr_effect);
- }
-
- (*d3dintf->effect.end)(curr_effect);
-
- curr_effect = effect;
-
- //(*d3dintf->effect.set_float)(curr_effect, "PostPass", 1.0f);
-
- //blit(backbuffer, ct->last_texture, NULL, poly->type, vertnum, poly->count, d3d->width, d3d->height);
-
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 9\n", (int)result);
-
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[2]);
-
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion);
-
- (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
+ //HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
+ //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ //result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
#endif
-
- poly->texture->cur_frame++;
- poly->texture->cur_frame %= options->yiq_phase_count;
+ texture->increment_frame_count();
+ texture->mask_frame_count(options->yiq_phase_count);
options->params_dirty = false;
+
}
#if HLSL_VECTOR
- else if(PRIMFLAG_GET_VECTOR(poly->flags) && vector_enable)
+ else if(PRIMFLAG_GET_VECTOR(poly->get_flags()) && vector_enable)
{
- d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
+ render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
if (rt == NULL)
{
return;
@@ -2191,50 +2170,49 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
lines_pending = true;
curr_effect = vector_effect;
- //curr_effect = effect;
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
}
- float time_params[2] = { poly->line_time, options->vector_time_scale };
- float length_params[3] = { poly->line_length, options->vector_length_scale, options->vector_length_ratio };
+ float time_params[2] = { poly->get_line_time(), options->vector_time_scale };
+ float length_params[3] = { poly->get_line_length(), options->vector_length_scale, options->vector_length_ratio };
(*d3dintf->effect.set_vector)(curr_effect, "TimeParams", 2, time_params);
(*d3dintf->effect.set_vector)(curr_effect, "LengthParams", 3, length_params);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- curr_effect = effect;
+ curr_effect = default_effect;
(*d3dintf->effect.set_float)(curr_effect, "FixedAlpha", 1.0f);
}
- else if (PRIMFLAG_GET_VECTORBUF(poly->flags) && vector_enable)
+ else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable)
{
//if (!lines_pending)
//return;
//lines_pending = false;
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- d3d_render_target *rt = find_render_target(d3d->width, d3d->height, 0, 0);
+ render_target *rt = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
if (rt == NULL)
{
return;
@@ -2243,12 +2221,12 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
/* Bloom */
curr_effect = downsample_effect;
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[0]);
- int bloom_size = (d3d->width < d3d->height) ? d3d->width : d3d->height;
+ int bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height();
int bloom_index = 0;
- int bloom_width = d3d->width;
- int bloom_height = d3d->height;
+ int bloom_width = d3d->get_width();
+ int bloom_height = d3d->get_height();
for(; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
{
float source_size[2] = { bloom_width, bloom_height };
@@ -2258,18 +2236,18 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->texture[0] : rt->bloom_texture[bloom_index - 1]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", (bloom_index == 0) ? rt->render_texture[0] : rt->bloom_texture[bloom_index - 1]);
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->bloom_target[bloom_index]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->bloom_target[bloom_index]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
- //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ //result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
//if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2281,13 +2259,13 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
bloom_height >>= 1;
}
- /* Bloom composite pass*/
+ // Bloom composite pass
curr_effect = bloom_effect;
- float target_size[2] = { d3d->width, d3d->height };
+ float target_size[2] = { d3d->get_width(), d3d->get_height() };
(*d3dintf->effect.set_vector)(curr_effect, "TargetSize", 2, target_size);
- (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->texture[0]);
+ (*d3dintf->effect.set_texture)(curr_effect, "DiffuseA", rt->render_texture[0]);
(*d3dintf->effect.set_float)(curr_effect, "DiffuseScaleA", 1.0f);
char name[9] = "Diffuse*";
@@ -2309,16 +2287,16 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[1]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 6\n", (int)result);
- //result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
- //if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
for (UINT pass = 0; pass < num_passes; pass++)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2330,20 +2308,20 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
if(options->params_dirty)
{
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_vector)(curr_effect, "Phosphor", 3, options->phosphor);
}
- (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->height);
+ (*d3dintf->effect.set_float)(curr_effect, "TextureWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TextureHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "Passthrough", 0.0f);
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[1]);
- (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->texture[2]);
+ (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->render_texture[1]);
+ (*d3dintf->effect.set_texture)(curr_effect, "LastPass", rt->render_texture[2]);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[3]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 4\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -2352,69 +2330,38 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLELIST, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(d3d->get_device(), D3DPT_TRIANGLELIST, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
(*d3dintf->effect.end)(curr_effect);
- //curr_effect = effect;
-
- //blit(backbuffer, rt->bloom_texture[5], NULL, poly->type, vertnum, poly->count);
- //blit(rt->target[2], rt->texture[0], NULL, poly->type, vertnum, poly->count);
- blit(backbuffer, rt->texture[0], NULL, poly->type, vertnum, poly->count);
- //blit(backbuffer, rt->texture[0], NULL, poly->type, vertnum, poly->count);
+ blit(rt->target[2], rt->render_texture[3], NULL, poly->get_type(), vertnum, poly->get_count());
+ blit(backbuffer, rt->render_texture[3], backbuffer, poly->get_type(), vertnum, poly->get_count());
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[0]);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, rt->target[0]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- /*curr_effect = post_effect;
-
- (*d3dintf->effect.set_texture)(curr_effect, "Diffuse", rt->texture[0]);
-
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", (float)poly->texture->rawwidth);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", (float)poly->texture->rawheight);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", 1.0f / (poly->texture->ustop - poly->texture->ustart));
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", 1.0f / (poly->texture->vstop - poly->texture->vstart));
-
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, rt->target[1]);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
-
- (*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
-
- for (UINT pass = 0; pass < num_passes; pass++)
- {
- (*d3dintf->effect.begin_pass)(curr_effect, pass);
- // add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
- (*d3dintf->effect.end_pass)(curr_effect);
- }
-
- (*d3dintf->effect.end)(curr_effect);*/
-
- vecbuf_type = poly->type;
- vecbuf_index = vertnum;
- vecbuf_count = poly->count;
+ lines_pending = false;
+ }
+#else
+ else if (PRIMFLAG_GET_VECTORBUF(poly->get_flags()) && vector_enable)
+ {
+ // Do nothing
}
#endif
else
{
- (*d3dintf->effect.set_float)(curr_effect, "RawWidth", poly->texture != NULL ? (float)poly->texture->rawwidth : 8.0f);
- (*d3dintf->effect.set_float)(curr_effect, "RawHeight", poly->texture != NULL ? (float)poly->texture->rawheight : 8.0f);
- (*d3dintf->effect.set_float)(curr_effect, "WidthRatio", poly->texture != NULL ? (1.0f / (poly->texture->ustop - poly->texture->ustart)) : 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "HeightRatio", poly->texture != NULL ? (1.0f / (poly->texture->vstop - poly->texture->vstart)) : 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->width);
- (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->height);
+ curr_effect = default_effect;
+
+ (*d3dintf->effect.set_float)(curr_effect, "TargetWidth", (float)d3d->get_width());
+ (*d3dintf->effect.set_float)(curr_effect, "TargetHeight", (float)d3d->get_height());
(*d3dintf->effect.set_float)(curr_effect, "PostPass", 0.0f);
- (*d3dintf->effect.set_float)(curr_effect, "PincushionAmount", options->pincushion);
(*d3dintf->effect.begin)(curr_effect, &num_passes, 0);
@@ -2422,7 +2369,7 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
{
(*d3dintf->effect.begin_pass)(curr_effect, pass);
// add the primitives
- HRESULT result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ HRESULT result = (*d3dintf->device.draw_primitive)(d3d->get_device(), poly->get_type(), vertnum, poly->get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
(*d3dintf->effect.end_pass)(curr_effect);
}
@@ -2434,10 +2381,10 @@ void hlsl_info::render_quad(d3d_poly_info *poly, int vertnum)
//============================================================
-// hlsl_info::end_draw
+// shaders::end_draw
//============================================================
-void hlsl_info::end_draw()
+void shaders::end_draw()
{
if (!master_enable || !d3dintf->post_fx_available)
return;
@@ -2447,23 +2394,23 @@ void hlsl_info::end_draw()
//============================================================
-// hlsl_info::register_prescaled_texture
+// shaders::register_prescaled_texture
//============================================================
-bool hlsl_info::register_prescaled_texture(d3d_texture_info *texture)
+bool shaders::register_prescaled_texture(texture_info *texture)
{
- return register_texture(texture, texture->rawwidth, texture->rawheight, texture->xprescale, texture->yprescale);
+ return register_texture(texture);
}
//============================================================
-// hlsl_info::add_cache_target - register a cache target
+// shaders::add_cache_target - register a cache target
//============================================================
-bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index)
+bool shaders::add_cache_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index)
{
- d3d_cache_target* target = (d3d_cache_target*)global_alloc_clear(d3d_cache_target);
+ cache_target* target = (cache_target*)global_alloc_clear(cache_target);
- if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale, false))
+ if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale))
{
global_free(target);
return false;
@@ -2471,13 +2418,13 @@ bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int widt
if (info != NULL)
{
- target->width = info->texinfo.width;
- target->height = info->texinfo.height;
+ target->width = info->get_texinfo().width;
+ target->height = info->get_texinfo().height;
}
else
{
- target->width = d3d->width;
- target->height = d3d->height;
+ target->width = d3d->get_width();
+ target->height = d3d->get_height();
}
target->next = cachehead;
@@ -2494,7 +2441,7 @@ bool hlsl_info::add_cache_target(d3d_info* d3d, d3d_texture_info* info, int widt
return true;
}
-d3d_render_target* hlsl_info::get_vector_target()
+render_target* shaders::get_vector_target()
{
#if HLSL_VECTOR
if (!vector_enable)
@@ -2502,18 +2449,19 @@ d3d_render_target* hlsl_info::get_vector_target()
return false;
}
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
- return find_render_target(d3d->width, d3d->height, 0, 0);
-#endif
+ return find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
+#else
return NULL;
+#endif
}
-void hlsl_info::create_vector_target(render_primitive *prim)
+void shaders::create_vector_target(render_primitive *prim)
{
#if HLSL_VECTOR
- d3d_info *d3d = (d3d_info *)window->drawdata;
- if (!add_render_target(d3d, NULL, d3d->width, d3d->height, 1, 1, true))
+ renderer *d3d = (renderer *)window->drawdata;
+ if (!add_render_target(d3d, NULL, d3d->get_width(), d3d->get_height(), 1, 1))
{
vector_enable = false;
}
@@ -2521,37 +2469,37 @@ void hlsl_info::create_vector_target(render_primitive *prim)
}
//============================================================
-// hlsl_info::add_render_target - register a render target
+// shaders::add_render_target - register a render target
//============================================================
-bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom)
+bool shaders::add_render_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale)
{
UINT32 screen_index = 0;
UINT32 page_index = 0;
if (info != NULL)
{
- d3d_render_target *existing_target = find_render_target(info);
+ render_target *existing_target = find_render_target(info);
if (existing_target != NULL)
{
remove_render_target(existing_target);
}
- UINT32 screen_index_data = (UINT32)info->texinfo.osddata;
+ UINT32 screen_index_data = (UINT32)info->get_texinfo().osddata;
screen_index = screen_index_data >> 1;
page_index = screen_index_data & 1;
}
else
{
- d3d_render_target *existing_target = find_render_target(d3d->width, d3d->height, 0, 0);
+ render_target *existing_target = find_render_target(d3d->get_width(), d3d->get_height(), 0, 0);
if (existing_target != NULL)
{
remove_render_target(existing_target);
}
}
- d3d_render_target* target = (d3d_render_target*)global_alloc_clear(d3d_render_target);
+ render_target* target = (render_target*)global_alloc_clear(render_target);
- if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale, bloom))
+ if (!target->init(d3d, d3dintf, width, height, xprescale, yprescale))
{
global_free(target);
return false;
@@ -2559,26 +2507,26 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid
if (info != NULL)
{
- target->width = info->texinfo.width;
- target->height = info->texinfo.height;
+ target->width = info->get_texinfo().width;
+ target->height = info->get_texinfo().height;
}
else
{
- target->width = d3d->width;
- target->height = d3d->height;
+ target->width = d3d->get_width();
+ target->height = d3d->get_height();
}
- HRESULT result = (*d3dintf->device.set_render_target)(d3d->device, 0, target->target[0]);
+ HRESULT result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, target->target[0]);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.clear)(d3d->get_device(), 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(d3d->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call\n", (int)result);
target->screen_index = screen_index;
target->page_index = page_index;
- d3d_cache_target* cache = find_cache_target(target->screen_index, target->width, target->height);
+ cache_target* cache = find_cache_target(target->screen_index, target->width, target->height);
if (cache == NULL)
{
if (!add_cache_target(d3d, info, width, height, xprescale, yprescale, target->screen_index))
@@ -2601,9 +2549,9 @@ bool hlsl_info::add_render_target(d3d_info* d3d, d3d_texture_info* info, int wid
}
//============================================================
-// hlsl_info::enumerate_screens
+// shaders::enumerate_screens
//============================================================
-void hlsl_info::enumerate_screens()
+void shaders::enumerate_screens()
{
screen_device_iterator iter(window->machine().root_device());
num_screens = iter.count();
@@ -2611,27 +2559,24 @@ void hlsl_info::enumerate_screens()
//============================================================
-// hlsl_info::register_texture
+// shaders::register_texture(texture::info)
//============================================================
-bool hlsl_info::register_texture(d3d_texture_info *texture)
+bool shaders::register_texture(texture_info *texture)
{
- return register_texture(texture, texture->rawwidth, texture->rawheight, 1, 1);
-}
-
-
-//============================================================
-// hlsl_info::register_texture(d3d_texture_info, int, int, int, int)
-//============================================================
+ int width = texture->get_width();
+ int height = texture->get_height();
+ int xscale = texture->get_xscale();
+ int yscale = texture->get_yscale();
-bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int height, int xscale, int yscale)
-{
if (!master_enable || !d3dintf->post_fx_available)
- return 0;
+ {
+ return false;
+ }
enumerate_screens();
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ renderer *d3d = (renderer *)window->drawdata;
int hlsl_prescale_x = prescale_force_x;
int hlsl_prescale_y = prescale_force_y;
@@ -2640,7 +2585,7 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh
if (hlsl_prescale_x == 0)
{
hlsl_prescale_x = 1;
- while (width * xscale * hlsl_prescale_x <= d3d->width)
+ while (width * xscale * hlsl_prescale_x <= d3d->get_width())
{
hlsl_prescale_x++;
}
@@ -2650,7 +2595,7 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh
if (hlsl_prescale_y == 0)
{
hlsl_prescale_y = 1;
- while (height * yscale * hlsl_prescale_y <= d3d->height)
+ while (height * yscale * hlsl_prescale_y <= d3d->get_height())
{
hlsl_prescale_y++;
}
@@ -2669,10 +2614,10 @@ bool hlsl_info::register_texture(d3d_texture_info *texture, int width, int heigh
}
//============================================================
-// hlsl_info::delete_resources
+// shaders::delete_resources
//============================================================
-void hlsl_info::delete_resources(bool reset)
+void shaders::delete_resources(bool reset)
{
if (!master_enable || !d3dintf->post_fx_available)
return;
@@ -2682,7 +2627,7 @@ void hlsl_info::delete_resources(bool reset)
if(write_ini && !reset)
{
emu_file file(downcast<windows_options &>(window->machine().options()).screen_post_fx_dir(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
- file_error filerr = open_next((d3d_info*)window->drawdata, file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0);
+ file_error filerr = open_next((renderer*)window->drawdata, file, downcast<windows_options &>(window->machine().options()).hlsl_ini_name(), "ini", 0);
if (filerr != FILERR_NONE)
return;
@@ -2744,7 +2689,7 @@ void hlsl_info::delete_resources(bool reset)
remove_render_target(targethead);
}
-#if HLSL_VECTOR
+#if (HLSL_VECTOR || CRT_BLOOM)
if (downsample_effect != NULL)
{
(*d3dintf->effect.release)(downsample_effect);
@@ -2756,10 +2701,10 @@ void hlsl_info::delete_resources(bool reset)
bloom_effect = NULL;
}
#endif
- if (effect != NULL)
+ if (default_effect != NULL)
{
- (*d3dintf->effect.release)(effect);
- effect = NULL;
+ (*d3dintf->effect.release)(default_effect);
+ default_effect = NULL;
}
if (post_effect != NULL)
{
@@ -3237,7 +3182,7 @@ static INT32 slider_saturation(running_machine &machine, void *arg, astring *str
// init_slider_list
//============================================================
-slider_state *hlsl_info::init_slider_list()
+slider_state *shaders::init_slider_list()
{
if (!master_enable || !d3dintf->post_fx_available)
{
@@ -3307,6 +3252,8 @@ slider_state *hlsl_info::init_slider_list()
return listhead;
}
+};
+
//============================================================
// get_slider_list
//============================================================
@@ -3325,12 +3272,12 @@ void *windows_osd_interface::get_slider_list()
// scheme
//-------------------------------------------------
-static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, const char *extension, int idx)
+static file_error open_next(d3d::renderer *d3d, emu_file &file, const char *templ, const char *extension, int idx)
{
UINT32 origflags = file.openflags();
// handle defaults
- const char *snapname = templ ? templ : d3d->window->machine().options().snap_name();
+ const char *snapname = templ ? templ : d3d->get_window()->machine().options().snap_name();
if (snapname == NULL || snapname[0] == 0)
snapname = "%g/%i";
@@ -3377,7 +3324,7 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co
snapdevname.cpysubstr(snapstr, pos + 3, end - pos - 3);
// verify that there is such a device for this system
- image_interface_iterator iter(d3d->window->machine().root_device());
+ image_interface_iterator iter(d3d->get_window()->machine().root_device());
for (device_image_interface *image = iter.first(); image != NULL; iter.next())
{
// get the device name
@@ -3414,7 +3361,7 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co
// substitute path and gamename up front
snapstr.replace(0, "/", PATH_SEPARATOR);
- snapstr.replace(0, "%g", d3d->window->machine().basename());
+ snapstr.replace(0, "%g", d3d->get_window()->machine().basename());
// determine if the template has an index; if not, we always use the same name
astring fname;
@@ -3443,3 +3390,4 @@ static file_error open_next(d3d_info *d3d, emu_file &file, const char *templ, co
file.set_openflags(origflags);
return file.open(fname);
}
+
diff --git a/src/osd/windows/d3dhlsl.h b/src/osd/windows/d3dhlsl.h
index 25c6cf77077..58c838a9ffe 100644
--- a/src/osd/windows/d3dhlsl.h
+++ b/src/osd/windows/d3dhlsl.h
@@ -48,15 +48,19 @@
// CONSTANTS
//============================================================
-#define HLSL_VECTOR (0)
+#define HLSL_VECTOR (1)
+#define CRT_BLOOM (1)
//============================================================
// TYPE DEFINITIONS
//============================================================
-class d3d_render_target;
-class d3d_cache_target;
-struct d3d_info;
+namespace d3d
+{
+
+class render_target;
+class cache_target;
+class renderer;
/* hlsl_options is the information about runtime-mutable Direct3D HLSL options */
/* in the future this will be moved into an OSD/emu shared buffer */
@@ -111,22 +115,35 @@ struct hlsl_options
float vector_time_period;
float vector_length_scale;
float vector_length_ratio;
+
+ // Bloom
+ float bloom_level0_weight;
+ float bloom_level1_weight;
+ float bloom_level2_weight;
+ float bloom_level3_weight;
+ float bloom_level4_weight;
+ float bloom_level5_weight;
+ float bloom_level6_weight;
+ float bloom_level7_weight;
+ float bloom_level8_weight;
+ float bloom_level9_weight;
+ float bloom_level10_weight;
};
-class hlsl_info
+class shaders
{
public:
// construction/destruction
- hlsl_info();
- ~hlsl_info();
+ shaders();
+ ~shaders();
- void init(d3d_base *d3dintf, win_window_info *window);
+ void init(base *d3dintf, win_window_info *window);
bool enabled() { return master_enable; }
void toggle();
bool vector_enabled() { return master_enable && vector_enable && (bool)HLSL_VECTOR; }
- d3d_render_target* get_vector_target();
+ render_target* get_vector_target();
void create_vector_target(render_primitive *prim);
void begin_frame();
@@ -135,28 +152,28 @@ public:
void begin_draw();
void end_draw();
- void init_effect_info(d3d_poly_info *poly);
- void render_quad(d3d_poly_info *poly, int vertnum);
+ void init_effect_info(poly_info *poly);
+ void render_quad(poly_info *poly, int vertnum);
- bool register_texture(d3d_texture_info *texture);
- bool register_prescaled_texture(d3d_texture_info *texture);
- bool add_render_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, bool bloom = false);
- bool add_cache_target(d3d_info* d3d, d3d_texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index);
+ bool register_texture(texture_info *texture);
+ bool register_prescaled_texture(texture_info *texture);
+ bool add_render_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale);
+ bool add_cache_target(renderer* d3d, texture_info* info, int width, int height, int xprescale, int yprescale, int screen_index);
void window_save();
void window_record();
bool recording() { return avi_output_file != NULL; }
- void avi_update_snap(d3d_surface *surface);
- void render_snapshot(d3d_surface *surface);
+ void avi_update_snap(surface *surface);
+ void render_snapshot(surface *surface);
void record_texture();
void init_fsfx_quad(void *vertbuf);
- void set_texture(d3d_texture_info *texture);
- d3d_render_target * find_render_target(d3d_texture_info *info);
- void remove_render_target(d3d_texture_info *texture);
+ void set_texture(texture_info *texture);
+ render_target * find_render_target(texture_info *info);
+ void remove_render_target(texture_info *texture);
void remove_render_target(int width, int height, UINT32 screen_index, UINT32 page_index);
- void remove_render_target(d3d_render_target *rt);
+ void remove_render_target(render_target *rt);
int create_resources(bool reset);
void delete_resources(bool reset);
@@ -165,23 +182,23 @@ public:
slider_state *init_slider_list();
private:
- void blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst,
+ void blit(surface *dst, texture *src, surface *new_dst,
D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count,
int dstw, int dsth);
- void blit(d3d_surface *dst, d3d_texture *src, d3d_surface *new_dst,
+ void blit(surface *dst, texture *src, surface *new_dst,
D3DPRIMITIVETYPE prim_type, UINT32 prim_index, UINT32 prim_count);
void enumerate_screens();
void end_avi_recording();
void begin_avi_recording(const char *name);
- bool register_texture(d3d_texture_info *texture, int width, int height, int xscale, int yscale);
+ bool register_texture(texture_info *texture, int width, int height, int xscale, int yscale);
- d3d_render_target* find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index);
- d3d_cache_target * find_cache_target(UINT32 screen_index, int width, int height);
- void remove_cache_target(d3d_cache_target *cache);
+ render_target* find_render_target(int width, int height, UINT32 screen_index, UINT32 page_index);
+ cache_target * find_cache_target(UINT32 screen_index, int width, int height);
+ void remove_cache_target(cache_target *cache);
- d3d_base * d3dintf; // D3D interface
+ base * d3dintf; // D3D interface
win_window_info * window; // D3D window info
bool master_enable; // overall enable flag
@@ -199,7 +216,7 @@ private:
int prescale_size_y; // prescale size y
int preset; // preset, if relevant
bitmap_argb32 shadow_bitmap; // shadow mask bitmap for post-processing shader
- d3d_texture_info * shadow_texture; // shadow mask texture for post-processing shader
+ texture_info * shadow_texture; // shadow mask texture for post-processing shader
hlsl_options * options; // current uniform state
D3DPRIMITIVETYPE vecbuf_type;
UINT32 vecbuf_index;
@@ -210,20 +227,20 @@ private:
int avi_frame; // AVI frame
attotime avi_frame_period; // AVI frame period
attotime avi_next_frame_time; // AVI next frame time
- d3d_surface * avi_copy_surface; // AVI destination surface in system memory
- d3d_texture * avi_copy_texture; // AVI destination texture in system memory
- d3d_surface * avi_final_target; // AVI upscaled surface
- d3d_texture * avi_final_texture; // AVI upscaled texture
+ surface * avi_copy_surface; // AVI destination surface in system memory
+ texture * avi_copy_texture; // AVI destination texture in system memory
+ surface * avi_final_target; // AVI upscaled surface
+ texture * avi_final_texture; // AVI upscaled texture
- d3d_surface * black_surface; // black dummy surface
- d3d_texture * black_texture; // black dummy texture
+ surface * black_surface; // black dummy surface
+ texture * black_texture; // black dummy texture
bool render_snap; // whether or not to take HLSL post-render snapshot
bool snap_rendered; // whether we just rendered our HLSL post-render shot or not
- d3d_surface * snap_copy_target; // snapshot destination surface in system memory
- d3d_texture * snap_copy_texture; // snapshot destination surface in system memory
- d3d_surface * snap_target; // snapshot upscaled surface
- d3d_texture * snap_texture; // snapshot upscaled texture
+ surface * snap_copy_target; // snapshot destination surface in system memory
+ texture * snap_copy_texture; // snapshot destination surface in system memory
+ surface * snap_target; // snapshot upscaled surface
+ texture * snap_texture; // snapshot upscaled texture
int snap_width; // snapshot width
int snap_height; // snapshot height
bool lines_pending; // whether or not we have lines to flush on the next quad
@@ -231,28 +248,34 @@ private:
bool initialized; // whether or not we're initialize
// HLSL effects
- d3d_surface * backbuffer; // pointer to our device's backbuffer
- d3d_effect * curr_effect; // pointer to the currently active effect object
- d3d_effect * effect; // pointer to the primary-effect object
- d3d_effect * prescale_effect; // pointer to the prescale-effect object
- d3d_effect * post_effect; // pointer to the post-effect object
- d3d_effect * pincushion_effect; // pointer to the pincushion-effect object
- d3d_effect * focus_effect; // pointer to the focus-effect object
- d3d_effect * phosphor_effect; // pointer to the phosphor-effect object
- d3d_effect * deconverge_effect; // pointer to the deconvergence-effect object
- d3d_effect * color_effect; // pointer to the color-effect object
- d3d_effect * yiq_encode_effect; // pointer to the YIQ encoder effect object
- d3d_effect * yiq_decode_effect; // pointer to the YIQ decoder effect object
-#if HLSL_VECTOR
- d3d_effect * bloom_effect; // pointer to the bloom composite effect
- d3d_effect * downsample_effect; // pointer to the bloom downsample effect
- d3d_effect * vector_effect; // pointer to the vector-effect object
+ 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 * prescale_effect; // pointer to the prescale-effect object
+ effect * post_effect; // pointer to the post-effect object
+ effect * pincushion_effect; // pointer to the pincushion-effect object
+ effect * focus_effect; // pointer to the focus-effect object
+ effect * phosphor_effect; // pointer to the phosphor-effect object
+ effect * deconverge_effect; // pointer to the deconvergence-effect object
+ effect * color_effect; // pointer to the color-effect object
+ effect * yiq_encode_effect; // pointer to the YIQ encoder effect object
+ effect * yiq_decode_effect; // pointer to the YIQ decoder effect object
+#if (HLSL_VECTOR || CRT_BLOOM)
+ effect * bloom_effect; // pointer to the bloom composite effect
+ effect * downsample_effect; // pointer to the bloom downsample effect
+#endif
+#if (HLSL_VECTOR)
+ effect * vector_effect; // pointer to the vector-effect object
#endif
- d3d_vertex * fsfx_vertices; // pointer to our full-screen-quad object
+ vertex * fsfx_vertices; // pointer to our full-screen-quad object
public:
- d3d_render_target * targethead;
- d3d_cache_target * cachehead;
+ render_target * targethead;
+ cache_target * cachehead;
+
+ static hlsl_options s_hlsl_presets[4];
+};
+
};
#endif
diff --git a/src/osd/windows/d3dintf.h b/src/osd/windows/d3dintf.h
index 27643afcdb8..a0a68f7fea7 100644
--- a/src/osd/windows/d3dintf.h
+++ b/src/osd/windows/d3dintf.h
@@ -56,8 +56,6 @@
#endif
-#if (DIRECT3D_VERSION >= 0x0900)
-// the following used to be TEXTURESTAGESTATES but are now SAMPLERSTATES
#define D3DTSS_ADDRESSU 13
#define D3DTSS_ADDRESSV 14
#define D3DTSS_BORDERCOLOR 15
@@ -67,28 +65,29 @@
#define D3DTSS_MIPMAPLODBIAS 19
#define D3DTSS_MAXMIPLEVEL 20
#define D3DTSS_MAXANISOTROPY 21
-#endif
+namespace d3d
+{
//============================================================
// TYPE DEFINITIONS
//============================================================
-struct d3d_base;
-struct d3d_device;
-struct d3d_surface;
-struct d3d_texture;
-struct d3d_vertex_buffer;
-struct d3d_effect;
-typedef D3DXVECTOR4 d3d_vector;
-typedef D3DMATRIX d3d_matrix;
+struct base;
+struct device;
+struct surface;
+struct texture;
+struct vertex_buffer;
+struct effect;
+typedef D3DXVECTOR4 vector;
+typedef D3DMATRIX matrix;
//============================================================
// Abstracted presentation parameters
//============================================================
-struct d3d_present_parameters
+struct present_parameters
{
UINT BackBufferWidth;
UINT BackBufferHeight;
@@ -111,7 +110,7 @@ struct d3d_present_parameters
// Abstracted device identifier
//============================================================
-struct d3d_adapter_identifier
+struct adapter_identifier
{
char Driver[512];
char Description[512];
@@ -129,7 +128,7 @@ struct d3d_adapter_identifier
// Caps enumeration
//============================================================
-enum d3d_caps_index
+enum caps_index
{
CAPS_PRESENTATION_INTERVALS,
CAPS_CAPS2,
@@ -152,19 +151,19 @@ enum d3d_caps_index
// Direct3D interfaces
//============================================================
-struct d3d_interface
+struct interface
{
- HRESULT (*check_device_format)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format);
- HRESULT (*check_device_type)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed);
- HRESULT (*create_device)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, d3d_present_parameters *params, d3d_device **dev);
- HRESULT (*enum_adapter_modes)(d3d_base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode);
- UINT (*get_adapter_count)(d3d_base *d3dptr);
- HRESULT (*get_adapter_display_mode)(d3d_base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode);
- HRESULT (*get_adapter_identifier)(d3d_base *d3dptr, UINT adapter, DWORD flags, d3d_adapter_identifier *identifier);
- UINT (*get_adapter_mode_count)(d3d_base *d3dptr, UINT adapter, D3DFORMAT format);
- HMONITOR (*get_adapter_monitor)(d3d_base *d3dptr, UINT adapter);
- HRESULT (*get_caps_dword)(d3d_base *d3dptr, UINT adapter, D3DDEVTYPE devtype, d3d_caps_index which, DWORD *value);
- ULONG (*release)(d3d_base *d3dptr);
+ HRESULT (*check_device_format)(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT adapterformat, DWORD usage, D3DRESOURCETYPE restype, D3DFORMAT format);
+ HRESULT (*check_device_type)(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, D3DFORMAT format, D3DFORMAT backformat, BOOL windowed);
+ HRESULT (*create_device)(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, HWND focus, DWORD behavior, present_parameters *params, device **dev);
+ HRESULT (*enum_adapter_modes)(base *d3dptr, UINT adapter, D3DFORMAT format, UINT index, D3DDISPLAYMODE *mode);
+ UINT (*get_adapter_count)(base *d3dptr);
+ HRESULT (*get_adapter_display_mode)(base *d3dptr, UINT adapter, D3DDISPLAYMODE *mode);
+ HRESULT (*get_adapter_identifier)(base *d3dptr, UINT adapter, DWORD flags, adapter_identifier *identifier);
+ UINT (*get_adapter_mode_count)(base *d3dptr, UINT adapter, D3DFORMAT format);
+ HMONITOR (*get_adapter_monitor)(base *d3dptr, UINT adapter);
+ HRESULT (*get_caps_dword)(base *d3dptr, UINT adapter, D3DDEVTYPE devtype, caps_index which, DWORD *value);
+ ULONG (*release)(base *d3dptr);
};
@@ -172,32 +171,32 @@ struct d3d_interface
// Direct3DDevice interfaces
//============================================================
-struct d3d_device_interface
+struct device_interface
{
- HRESULT (*begin_scene)(d3d_device *dev);
- HRESULT (*clear)(d3d_device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil);
- HRESULT (*create_offscreen_plain_surface)(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, d3d_surface **surface);
- HRESULT (*create_effect)(d3d_device *dev, const WCHAR *name, d3d_effect **effect);
- HRESULT (*create_texture)(d3d_device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, d3d_texture **texture);
- HRESULT (*create_vertex_buffer)(d3d_device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, d3d_vertex_buffer **buf);
- HRESULT (*create_render_target)(d3d_device *dev, UINT width, UINT height, D3DFORMAT format, d3d_surface **surface);
- HRESULT (*draw_primitive)(d3d_device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count);
- HRESULT (*end_scene)(d3d_device *dev);
- HRESULT (*get_raster_status)(d3d_device *dev, D3DRASTER_STATUS *status);
- HRESULT (*get_render_target)(d3d_device *dev, DWORD index, d3d_surface **surface);
- HRESULT (*get_render_target_data)(d3d_device *dev, d3d_surface *rendertarget, d3d_surface *destsurface);
- HRESULT (*present)(d3d_device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags);
- ULONG (*release)(d3d_device *dev);
- HRESULT (*reset)(d3d_device *dev, d3d_present_parameters *params);
- void (*set_gamma_ramp)(d3d_device *dev, DWORD flags, const D3DGAMMARAMP *ramp);
- HRESULT (*set_render_state)(d3d_device *dev, D3DRENDERSTATETYPE state, DWORD value);
- HRESULT (*set_render_target)(d3d_device *dev, DWORD index, d3d_surface *surf);
- HRESULT (*set_stream_source)(d3d_device *dev, UINT number, d3d_vertex_buffer *vbuf, UINT stride);
- HRESULT (*set_texture)(d3d_device *dev, DWORD stage, d3d_texture *tex);
- HRESULT (*set_texture_stage_state)(d3d_device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value);
- HRESULT (*set_vertex_format)(d3d_device *dev, D3DFORMAT format);
- HRESULT (*stretch_rect)(d3d_device *dev, d3d_surface *source, const RECT *srcrect, d3d_surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter);
- HRESULT (*test_cooperative_level)(d3d_device *dev);
+ HRESULT (*begin_scene)(device *dev);
+ HRESULT (*clear)(device *dev, DWORD count, const D3DRECT *rects, DWORD flags, D3DCOLOR color, float z, DWORD stencil);
+ HRESULT (*create_offscreen_plain_surface)(device *dev, UINT width, UINT height, D3DFORMAT format, D3DPOOL pool, surface **surface);
+ HRESULT (*create_effect)(device *dev, const WCHAR *name, effect **effect);
+ HRESULT (*create_texture)(device *dev, UINT width, UINT height, UINT levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, texture **texture);
+ HRESULT (*create_vertex_buffer)(device *dev, UINT length, DWORD usage, DWORD fvf, D3DPOOL pool, vertex_buffer **buf);
+ HRESULT (*create_render_target)(device *dev, UINT width, UINT height, D3DFORMAT format, surface **surface);
+ HRESULT (*draw_primitive)(device *dev, D3DPRIMITIVETYPE type, UINT start, UINT count);
+ HRESULT (*end_scene)(device *dev);
+ HRESULT (*get_raster_status)(device *dev, D3DRASTER_STATUS *status);
+ HRESULT (*get_render_target)(device *dev, DWORD index, surface **surface);
+ HRESULT (*get_render_target_data)(device *dev, surface *rendertarget, surface *destsurface);
+ HRESULT (*present)(device *dev, const RECT *source, const RECT *dest, HWND override, RGNDATA *dirty, DWORD flags);
+ ULONG (*release)(device *dev);
+ HRESULT (*reset)(device *dev, present_parameters *params);
+ void (*set_gamma_ramp)(device *dev, DWORD flags, const D3DGAMMARAMP *ramp);
+ HRESULT (*set_render_state)(device *dev, D3DRENDERSTATETYPE state, DWORD value);
+ HRESULT (*set_render_target)(device *dev, DWORD index, surface *surf);
+ HRESULT (*set_stream_source)(device *dev, UINT number, vertex_buffer *vbuf, UINT stride);
+ HRESULT (*set_texture)(device *dev, DWORD stage, texture *tex);
+ HRESULT (*set_texture_stage_state)(device *dev, DWORD stage, D3DTEXTURESTAGESTATETYPE state, DWORD value);
+ HRESULT (*set_vertex_format)(device *dev, D3DFORMAT format);
+ HRESULT (*stretch_rect)(device *dev, surface *source, const RECT *srcrect, surface *dest, const RECT *dstrect, D3DTEXTUREFILTERTYPE filter);
+ HRESULT (*test_cooperative_level)(device *dev);
};
@@ -205,11 +204,11 @@ struct d3d_device_interface
// Direct3DSurface interfaces
//============================================================
-struct d3d_surface_interface
+struct surface_interface
{
- HRESULT (*lock_rect)(d3d_surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags);
- ULONG (*release)(d3d_surface *tex);
- HRESULT (*unlock_rect)(d3d_surface *surf);
+ HRESULT (*lock_rect)(surface *surf, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags);
+ ULONG (*release)(surface *tex);
+ HRESULT (*unlock_rect)(surface *surf);
};
@@ -217,12 +216,12 @@ struct d3d_surface_interface
// Direct3DTexture interfaces
//============================================================
-struct d3d_texture_interface
+struct texture_interface
{
- HRESULT (*get_surface_level)(d3d_texture *tex, UINT level, d3d_surface **surface);
- HRESULT (*lock_rect)(d3d_texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags);
- ULONG (*release)(d3d_texture *tex);
- HRESULT (*unlock_rect)(d3d_texture *tex, UINT level);
+ HRESULT (*get_surface_level)(texture *tex, UINT level, surface **surface);
+ HRESULT (*lock_rect)(texture *tex, UINT level, D3DLOCKED_RECT *locked, const RECT *rect, DWORD flags);
+ ULONG (*release)(texture *tex);
+ HRESULT (*unlock_rect)(texture *tex, UINT level);
};
@@ -230,11 +229,11 @@ struct d3d_texture_interface
// Direct3DVertexBuffer interfaces
//============================================================
-struct d3d_vertex_buffer_interface
+struct vertex_buffer_interface
{
- HRESULT (*lock)(d3d_vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags);
- ULONG (*release)(d3d_vertex_buffer *vbuf);
- HRESULT (*unlock)(d3d_vertex_buffer *vbuf);
+ HRESULT (*lock)(vertex_buffer *vbuf, UINT offset, UINT size, VOID **data, DWORD flags);
+ ULONG (*release)(vertex_buffer *vbuf);
+ HRESULT (*unlock)(vertex_buffer *vbuf);
};
@@ -242,19 +241,19 @@ struct d3d_vertex_buffer_interface
// Direct3DEffect interfaces
//============================================================
-struct d3d_effect_interface
+struct effect_interface
{
- void (*begin)(d3d_effect *effect, UINT *passes, DWORD flags);
- void (*end)(d3d_effect *effect);
- void (*begin_pass)(d3d_effect *effect, UINT pass);
- void (*end_pass)(d3d_effect *effect);
- void (*set_technique)(d3d_effect *effect, const char *name);
- void (*set_vector)(d3d_effect *effect, const char *name, int count, float *vector);
- void (*set_float)(d3d_effect *effect, const char *name, float value);
- void (*set_int)(d3d_effect *effect, const char *name, int value);
- void (*set_matrix)(d3d_effect *effect, const char *name, d3d_matrix *matrix);
- void (*set_texture)(d3d_effect *effect, const char *name, d3d_texture *tex);
- ULONG (*release)(d3d_effect *effect);
+ void (*begin)(effect *effect, UINT *passes, DWORD flags);
+ void (*end)(effect *effect);
+ void (*begin_pass)(effect *effect, UINT pass);
+ void (*end_pass)(effect *effect);
+ void (*set_technique)(effect *effect, const char *name);
+ void (*set_vector)(effect *effect, const char *name, int count, float *vector);
+ void (*set_float)(effect *effect, const char *name, float value);
+ void (*set_int)(effect *effect, const char *name, int value);
+ void (*set_matrix)(effect *effect, const char *name, matrix *matrix);
+ void (*set_texture)(effect *effect, const char *name, texture *tex);
+ ULONG (*release)(effect *effect);
};
@@ -262,7 +261,7 @@ struct d3d_effect_interface
// Core D3D object
//============================================================
-struct d3d_base
+struct base
{
// internal objects
int version;
@@ -271,12 +270,12 @@ struct d3d_base
bool post_fx_available;
// interface pointers
- d3d_interface d3d;
- d3d_device_interface device;
- d3d_surface_interface surface;
- d3d_texture_interface texture;
- d3d_vertex_buffer_interface vertexbuf;
- d3d_effect_interface effect;
+ interface d3d;
+ device_interface device;
+ surface_interface surface;
+ texture_interface texture;
+ vertex_buffer_interface vertexbuf;
+ effect_interface effect;
};
@@ -284,10 +283,8 @@ struct d3d_base
// PROTOTYPES
//============================================================
-#if DIRECT3D_VERSION < 0x0900
-d3d_base *drawd3d8_init(void);
-#endif
-d3d_base *drawd3d9_init(void);
+base *drawd3d9_init(void);
+};
#endif
diff --git a/src/osd/windows/drawd3d.c b/src/osd/windows/drawd3d.c
index 7aa426d4867..1fda54992c7 100644
--- a/src/osd/windows/drawd3d.c
+++ b/src/osd/windows/drawd3d.c
@@ -113,8 +113,6 @@ enum
// GLOBALS
//============================================================
-static d3d_base * d3dintf; // FIX ME
-
static const line_aa_step line_aa_1step[] =
{
{ 0.00f, 0.00f, 1.00f },
@@ -202,80 +200,231 @@ INLINE UINT32 ycc_to_rgb(UINT8 y, UINT8 cb, UINT8 cr)
return MAKE_ARGB(0xff, r, g, b);
}
+//============================================================
+// drawd3d_init
+//============================================================
-INLINE UINT32 texture_compute_hash(const render_texinfo *texture, UINT32 flags)
+static d3d::base * d3dintf; // FIX ME
+
+//============================================================
+// PROTOTYPES
+//============================================================
+
+// core functions
+static void drawd3d_exit(void);
+static int drawd3d_window_init(win_window_info *window);
+static void drawd3d_window_destroy(win_window_info *window);
+static render_primitive_list *drawd3d_window_get_primitives(win_window_info *window);
+static void drawd3d_window_save(win_window_info *window);
+static void drawd3d_window_record(win_window_info *window);
+static void drawd3d_window_toggle_fsfx(win_window_info *window);
+static int drawd3d_window_draw(win_window_info *window, HDC dc, int update);
+
+
+//============================================================
+// drawd3d_window_init
+//============================================================
+
+static int drawd3d_window_init(win_window_info *window)
{
- return (FPTR)texture->base ^ (flags & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK));
+ // allocate memory for our structures
+ d3d::renderer *d3d = global_alloc(d3d::renderer(window));
+ window->drawdata = d3d;
+
+ if (!d3d->initialize())
+ {
+ drawd3d_window_destroy(window);
+ mame_printf_error("Unable to initialize Direct3D.\n");
+ return 1;
+ }
+
+ return 0;
}
+//============================================================
+// drawd3d_exit
+//============================================================
+
+static void drawd3d_exit(void)
+{
+ if (d3dintf != NULL)
+ (*d3dintf->d3d.release)(d3dintf);
+}
-INLINE void set_texture(d3d_info *d3d, d3d_texture_info *texture)
+static void drawd3d_window_toggle_fsfx(win_window_info *window)
{
- HRESULT result;
- if (texture != d3d->last_texture)
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+ d3d->set_restarting(true);
+}
+
+static void drawd3d_window_record(win_window_info *window)
+{
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+ d3d->get_shaders()->window_record();
+}
+
+static void drawd3d_window_save(win_window_info *window)
+{
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+ d3d->get_shaders()->window_save();
+}
+
+
+
+//============================================================
+// drawd3d_window_destroy
+//============================================================
+
+static void drawd3d_window_destroy(win_window_info *window)
+{
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+
+ // skip if nothing
+ if (d3d == NULL)
+ return;
+
+ if (d3d->get_shaders()->recording())
+ d3d->get_shaders()->window_record();
+
+ // free the memory in the window
+ global_free(d3d);
+ window->drawdata = NULL;
+}
+
+
+
+//============================================================
+// drawd3d_window_get_primitives
+//============================================================
+
+static render_primitive_list *drawd3d_window_get_primitives(win_window_info *window)
+{
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+ RECT client;
+
+ GetClientRectExceptMenu(window->hwnd, &client, window->fullscreen);
+ if (rect_width(&client) > 0 && rect_height(&client) > 0)
{
- d3d->last_texture = texture;
- d3d->last_texture_flags = (texture == NULL ? 0 : texture->flags);
- result = (*d3dintf->device.set_texture)(d3d->device, 0, (texture == NULL) ? d3d->default_texture->d3dfinaltex : texture->d3dfinaltex);
- d3d->hlsl->set_texture(texture);
+ window->target->set_bounds(rect_width(&client), rect_height(&client), winvideo_monitor_get_aspect(window->monitor));
+ window->target->set_max_update_rate((d3d->get_refresh() == 0) ? d3d->get_origmode().RefreshRate : d3d->get_refresh());
+ }
+ return &window->target->get_primitives();
+}
+
+int drawd3d_init(running_machine &machine, win_draw_callbacks *callbacks)
+{
+ d3dintf = NULL;
+
+ // Use Direct3D9
+ d3dintf = d3d::drawd3d9_init();
+
+ // if we failed, note the error
+ if (d3dintf == NULL)
+ {
+ mame_printf_error("Unable to initialize Direct3D.\n");
+ return 1;
+ }
+
+ // fill in the callbacks
+ callbacks->exit = drawd3d_exit;
+ callbacks->window_init = drawd3d_window_init;
+ callbacks->window_get_primitives = drawd3d_window_get_primitives;
+ callbacks->window_draw = drawd3d_window_draw;
+ callbacks->window_save = drawd3d_window_save;
+ callbacks->window_record = drawd3d_window_record;
+ callbacks->window_toggle_fsfx = drawd3d_window_toggle_fsfx;
+ callbacks->window_destroy = drawd3d_window_destroy;
+ return 0;
+}
+
+//============================================================
+// drawd3d_window_draw
+//============================================================
+
+static int drawd3d_window_draw(win_window_info *window, HDC dc, int update)
+{
+ d3d::renderer *d3d = (d3d::renderer *)window->drawdata;
+
+ // if we haven't been created, just punt
+ if (d3d == NULL)
+ return 1;
+
+ int check = d3d->pre_window_draw_check();
+ if (check >= 0)
+ return check;
+
+ d3d->begin_frame();
+ d3d->process_primitives();
+ d3d->end_frame();
+
+ return 0;
+}
+
+namespace d3d
+{
+
+void renderer::set_texture(texture_info *texture)
+{
+ if (texture != m_last_texture)
+ {
+ m_last_texture = texture;
+ m_last_texture_flags = (texture == NULL ? 0 : texture->get_flags());
+ HRESULT result = (*d3dintf->device.set_texture)(m_device, 0, (texture == NULL) ? get_default_texture()->get_finaltex() : texture->get_finaltex());
+ m_shaders->set_texture(texture);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result);
}
}
-INLINE void set_filter(d3d_info *d3d, int filter)
+void renderer::set_filter(int filter)
{
- HRESULT result;
- if (filter != d3d->last_filter)
+ if (filter != m_last_filter)
{
- d3d->last_filter = filter;
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
+ m_last_filter = filter;
+ HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MINFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_MAGFILTER, filter ? D3DTEXF_LINEAR : D3DTEXF_POINT);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
}
}
-INLINE void set_wrap(d3d_info *d3d, int wrap)
+void renderer::set_wrap(D3DTEXTUREADDRESS wrap)
{
- HRESULT result;
- if (wrap != d3d->last_wrap)
+ if (wrap != m_last_wrap)
{
- d3d->last_wrap = wrap;
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+ m_last_wrap = wrap;
+ HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSU, wrap);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, (D3DTEXTURESTAGESTATETYPE)D3DTSS_ADDRESSV, wrap);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
}
}
-INLINE void set_modmode(d3d_info *d3d, DWORD modmode)
+void renderer::set_modmode(DWORD modmode)
{
- HRESULT result;
- if (modmode != d3d->last_modmode)
+ if (modmode != m_last_modmode)
{
- d3d->last_modmode = modmode;
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, D3DTSS_COLOROP, modmode);
+ m_last_modmode = modmode;
+ HRESULT result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_COLOROP, modmode);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, D3DTSS_COLOROP, modmode);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_COLOROP, modmode);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture_stage_state call\n", (int)result);
}
}
-INLINE void set_blendmode(d3d_info *d3d, int blendmode)
+void renderer::set_blendmode(int blendmode)
{
- HRESULT result;
int blendenable;
int blendop;
int blendsrc;
@@ -292,437 +441,495 @@ INLINE void set_blendmode(d3d_info *d3d, int blendmode)
}
// adjust the bits that changed
- if (blendenable != d3d->last_blendenable)
+ if (blendenable != m_last_blendenable)
{
- d3d->last_blendenable = blendenable;
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ALPHABLENDENABLE, blendenable);
+ m_last_blendenable = blendenable;
+ HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHABLENDENABLE, blendenable);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result);
}
- if (blendop != d3d->last_blendop)
+ if (blendop != m_last_blendop)
{
- d3d->last_blendop = blendop;
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_BLENDOP, blendop);
+ m_last_blendop = blendop;
+ HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_BLENDOP, blendop);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result);
}
- if (blendsrc != d3d->last_blendsrc)
+ if (blendsrc != m_last_blendsrc)
{
- d3d->last_blendsrc = blendsrc;
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_SRCBLEND, blendsrc);
+ m_last_blendsrc = blendsrc;
+ HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SRCBLEND, blendsrc);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result);
}
- if (blenddst != d3d->last_blenddst)
+ if (blenddst != m_last_blenddst)
{
- d3d->last_blenddst = blenddst;
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_DESTBLEND, blenddst);
+ m_last_blenddst = blenddst;
+ HRESULT result = (*d3dintf->device.set_render_state)(m_device, D3DRS_DESTBLEND, blenddst);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_state call\n", (int)result);
}
}
-INLINE void reset_render_states(d3d_info *d3d)
+void renderer::reset_render_states()
{
// this ensures subsequent calls to the above setters will force-update the data
- d3d->last_texture = (d3d_texture_info *)~0;
- d3d->last_filter = -1;
- d3d->last_blendenable = -1;
- d3d->last_blendop = -1;
- d3d->last_blendsrc = -1;
- d3d->last_blenddst = -1;
- d3d->last_wrap = -1;
+ m_last_texture = (texture_info *)~0;
+ m_last_filter = -1;
+ m_last_blendenable = -1;
+ m_last_blendop = -1;
+ m_last_blendsrc = -1;
+ m_last_blenddst = -1;
+ m_last_wrap = (D3DTEXTUREADDRESS)-1;
}
-//============================================================
-// PROTOTYPES
-//============================================================
-
-// core functions
-static void drawd3d_exit(void);
-static int drawd3d_window_init(win_window_info *window);
-static void drawd3d_window_destroy(win_window_info *window);
-static render_primitive_list *drawd3d_window_get_primitives(win_window_info *window);
-static void drawd3d_window_save(win_window_info *window);
-static void drawd3d_window_record(win_window_info *window);
-static void drawd3d_window_toggle_fsfx(win_window_info *window);
-static int drawd3d_window_draw(win_window_info *window, HDC dc, int update);
-
-// devices
-static int device_create(win_window_info *window);
-static int device_create_resources(d3d_info *d3d);
-static void device_delete(d3d_info *d3d);
-static void device_delete_resources(d3d_info *d3d);
-static int device_verify_caps(d3d_info *d3d, win_window_info *window);
-static int device_test_cooperative(d3d_info *d3d);
-
-// video modes
-static int config_adapter_mode(win_window_info *window);
-static int get_adapter_for_monitor(d3d_info *d3d, win_monitor_info *monitor);
-static void pick_best_mode(win_window_info *window);
-static int update_window_size(win_window_info *window);
-
-// drawing
-static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_time);
-static void draw_quad(d3d_info *d3d, const render_primitive *prim);
-
-// primitives
-static d3d_vertex *primitive_alloc(d3d_info *d3d, int numverts);
-static void primitive_flush_pending(d3d_info *d3d);
-
-// textures
-static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d_texture_info *texture);
-static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const render_texinfo *texsource, UINT32 flags);
-static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture);
-static d3d_texture_info *texture_find(d3d_info *d3d, const render_primitive *prim);
-static void texture_update(d3d_info *d3d, const render_primitive *prim);
+texture_manager::texture_manager(renderer *d3d)
+{
+ m_renderer = d3d;
-//============================================================
-// drawd3d_init
-//============================================================
+ m_texlist = NULL;
-int drawd3d_init(running_machine &machine, win_draw_callbacks *callbacks)
-{
- int version = downcast<windows_options &>(machine.options()).d3d_version();
- d3dintf = NULL;
+ // check for dynamic texture support
+ DWORD tempcaps;
+ HRESULT result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_CAPS2, &tempcaps);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
+ m_dynamic_supported = ((tempcaps & D3DCAPS2_DYNAMICTEXTURES) != 0);
+ if (m_dynamic_supported) mame_printf_verbose("Direct3D: Using dynamic textures\n");
- // try Direct3D 9 if requested
- if (version >= 9)
- d3dintf = drawd3d9_init();
+ // check for stretchrect support
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_STRETCH_RECT_FILTER, &tempcaps);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
+ m_stretch_supported = ((tempcaps & D3DPTFILTERCAPS_MAGFPOINT) != 0);
+ if (m_stretch_supported && video_config.prescale > 1) mame_printf_verbose("Direct3D: Using StretchRect for prescaling\n");
-#if DIRECT3D_VERSION < 0x0900
- // if that didn't work, try Direct3D 8
- if (d3dintf == NULL && version >= 8)
- d3dintf = drawd3d8_init();
-#endif
+ // get texture caps
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_TEXTURE_CAPS, &m_texture_caps);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_ASPECT, &m_texture_max_aspect);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_WIDTH, &m_texture_max_width);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_HEIGHT, &m_texture_max_height);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- // if we failed, note the error
- if (d3dintf == NULL)
+ // pick a YUV texture format
+ m_yuv_format = D3DFMT_UYVY;
+ result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_UYVY);
+ if (result != D3D_OK)
{
- mame_printf_error("Unable to initialize Direct3D.\n");
- return 1;
+ m_yuv_format = D3DFMT_YUY2;
+ result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->get_adapter(), D3DDEVTYPE_HAL, d3d->get_pixel_format(), 0, D3DRTYPE_TEXTURE, D3DFMT_YUY2);
+ if (result != D3D_OK)
+ m_yuv_format = D3DFMT_A8R8G8B8;
}
+ mame_printf_verbose("Direct3D: YUV format = %s\n", (m_yuv_format == D3DFMT_YUY2) ? "YUY2" : (m_yuv_format == D3DFMT_UYVY) ? "UYVY" : "RGB");
- // fill in the callbacks
- callbacks->exit = drawd3d_exit;
- callbacks->window_init = drawd3d_window_init;
- callbacks->window_get_primitives = drawd3d_window_get_primitives;
- callbacks->window_draw = drawd3d_window_draw;
- callbacks->window_save = drawd3d_window_save;
- callbacks->window_record = drawd3d_window_record;
- callbacks->window_toggle_fsfx = drawd3d_window_toggle_fsfx;
- callbacks->window_destroy = drawd3d_window_destroy;
- return 0;
-}
-
-
-
-//============================================================
-// drawd3d_exit
-//============================================================
-
-static void drawd3d_exit(void)
-{
- if (d3dintf != NULL)
- (*d3dintf->d3d.release)(d3dintf);
+ // set the max texture size
+ d3d->get_window()->target->set_max_texture_size(m_texture_max_width, m_texture_max_height);
+ mame_printf_verbose("Direct3D: Max texture size = %dx%d\n", (int)m_texture_max_width, (int)m_texture_max_height);
}
-
-
-//============================================================
-// drawd3d_window_init
-//============================================================
-
-static int drawd3d_window_init(win_window_info *window)
+void texture_manager::create_resources()
{
- d3d_info *d3d;
-
- // allocate memory for our structures
- d3d = global_alloc_clear(d3d_info);
- d3d->restarting = false;
- window->drawdata = d3d;
- d3d->window = window;
- d3d->hlsl = NULL;
-
// experimental: load a PNG to use for vector rendering; it is treated
// as a brightness map
- emu_file file(window->machine().options().art_path(), OPEN_FLAG_READ);
- render_load_png(d3d->vector_bitmap, file, NULL, "vector.png");
- if (d3d->vector_bitmap.valid())
+ emu_file file(m_renderer->get_window()->machine().options().art_path(), OPEN_FLAG_READ);
+ render_load_png(m_vector_bitmap, file, NULL, "vector.png");
+ if (m_vector_bitmap.valid())
{
- d3d->vector_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff));
- render_load_png(d3d->vector_bitmap, file, NULL, "vector.png", true);
+ m_vector_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff));
+ render_load_png(m_vector_bitmap, file, NULL, "vector.png", true);
}
- d3d->default_bitmap.allocate(8, 8);
- d3d->default_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff));
+ m_default_bitmap.allocate(8, 8);
+ m_default_bitmap.fill(MAKE_ARGB(0xff,0xff,0xff,0xff));
- // configure the adapter for the mode we want
- if (config_adapter_mode(window))
- goto error;
+ if (m_default_bitmap.valid())
+ {
+ render_texinfo texture;
- // create the device immediately for the full screen case (defer for window mode)
- if (window->fullscreen && device_create(window))
- goto error;
+ // fake in the basic data so it looks like it came from render.c
+ texture.base = m_default_bitmap.raw_pixptr(0);
+ texture.rowpixels = m_default_bitmap.rowpixels();
+ texture.width = m_default_bitmap.width();
+ texture.height = m_default_bitmap.height();
+ texture.palette = NULL;
+ texture.seqid = 0;
- return 0;
+ // now create it
+ m_default_texture = global_alloc(texture_info(this, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)));
+ }
-error:
- drawd3d_window_destroy(window);
- mame_printf_error("Unable to initialize Direct3D.\n");
- return 1;
-}
+ // experimental: if we have a vector bitmap, create a texture for it
+ if (m_vector_bitmap.valid())
+ {
+ render_texinfo texture;
+ // fake in the basic data so it looks like it came from render.c
+ texture.base = &m_vector_bitmap.pix32(0);
+ texture.rowpixels = m_vector_bitmap.rowpixels();
+ texture.width = m_vector_bitmap.width();
+ texture.height = m_vector_bitmap.height();
+ texture.palette = NULL;
+ texture.seqid = 0;
+ // now create it
+ m_vector_texture = global_alloc(texture_info(this, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32)));
+ }
+}
-static void drawd3d_window_toggle_fsfx(win_window_info *window)
+void texture_manager::delete_resources()
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ global_free(m_default_texture);
+ m_default_texture = NULL;
- d3d->restarting = true;
+ // free all textures
+ while (m_texlist != NULL)
+ {
+ texture_info *tex = m_texlist;
+ m_texlist = tex->get_next();
+ global_free(tex);
+ }
}
-static void drawd3d_window_record(win_window_info *window)
+UINT32 texture_manager::texture_compute_hash(const render_texinfo *texture, UINT32 flags)
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
-
- d3d->hlsl->window_record();
+ return (FPTR)texture->base ^ (flags & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK));
}
-static void drawd3d_window_save(win_window_info *window)
+texture_info *texture_manager::find_texinfo(const render_texinfo *texinfo, UINT32 flags)
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
-
- d3d->hlsl->window_save();
-}
+ UINT32 hash = texture_compute_hash(texinfo, flags);
+ texture_info *texture;
+ // find a match
+ for (texture = m_renderer->get_texture_manager()->get_texlist(); texture != NULL; texture = texture->get_next())
+ {
+ UINT32 test_screen = (UINT32)texture->get_texinfo().osddata >> 1;
+ UINT32 test_page = (UINT32)texture->get_texinfo().osddata & 1;
+ UINT32 prim_screen = (UINT32)texinfo->osddata >> 1;
+ UINT32 prim_page = (UINT32)texinfo->osddata & 1;
+ if (test_screen != prim_screen || test_page != prim_page)
+ {
+ continue;
+ }
+ if (texture->get_hash() == hash &&
+ texture->get_texinfo().base == texinfo->base &&
+ texture->get_texinfo().width == texinfo->width &&
+ texture->get_texinfo().height == texinfo->height &&
+ ((texture->get_flags() ^ flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
+ {
+ // Reject a texture if it belongs to an out-of-date render target, so as to cause the HLSL system to re-cache
+ if (m_renderer->get_shaders()->enabled() && texinfo->width != 0 && texinfo->height != 0 && (flags & PRIMFLAG_SCREENTEX_MASK) != 0)
+ {
+ if (m_renderer->get_shaders()->find_render_target(texture) != NULL)
+ {
+ return texture;
+ }
+ }
+ else
+ {
+ return texture;
+ }
+ }
+ }
-//============================================================
-// drawd3d_window_destroy
-//============================================================
+ // Nothing found
+ /*int checkidx = 0;
+ for (texture = m_renderer->get_texture_manager()->get_texlist(); texture != NULL; texture = texture->get_next())
+ {
+ printf("Checking texture index %d\n", checkidx);
+ UINT32 test_screen = (UINT32)texture->get_texinfo().osddata >> 1;
+ UINT32 test_page = (UINT32)texture->get_texinfo().osddata & 1;
+ UINT32 prim_screen = (UINT32)texinfo->osddata >> 1;
+ UINT32 prim_page = (UINT32)texinfo->osddata & 1;
+ if (test_screen != prim_screen || test_page != prim_page)
+ {
+ printf("No screen/page match: %d vs. %d, %d vs. %d\n", test_screen, prim_screen, test_page, prim_page);
+ continue;
+ }
-static void drawd3d_window_destroy(win_window_info *window)
-{
- d3d_info *d3d = (d3d_info *)window->drawdata;
+ if (texture->get_hash() == hash &&
+ texture->get_texinfo().base == texinfo->base &&
+ texture->get_texinfo().width == texinfo->width &&
+ texture->get_texinfo().height == texinfo->height &&
+ ((texture->get_flags() ^ flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
+ {
+ // Reject a texture if it belongs to an out-of-date render target, so as to cause the HLSL system to re-cache
+ if (m_renderer->get_shaders()->enabled() && texinfo->width != 0 && texinfo->height != 0 && (flags & PRIMFLAG_SCREENTEX_MASK) != 0)
+ {
+ if (m_renderer->get_shaders()->find_render_target(texture) != NULL)
+ {
+ return texture;
+ }
+ }
+ else
+ {
+ return texture;
+ }
+ }
- // skip if nothing
- if (d3d == NULL)
- return;
+ if (texture->get_hash() != hash)
+ {
+ printf("No hash match: %d vs. %d\n", texture->get_hash(), hash);
+ }
+ if (texture->get_texinfo().base != texinfo->base)
+ {
+ printf("No base match\n");
+ }
+ if (texture->get_texinfo().width != texinfo->width)
+ {
+ printf("No width match: %d vs. %d\n", texture->get_texinfo().width, texinfo->width);
+ }
+ if (texture->get_texinfo().height != texinfo->height)
+ {
+ printf("No height match: %d vs. %d\n", texture->get_texinfo().height, texinfo->height);
+ }
+ if (((texture->get_flags() ^ flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) != 0)
+ {
+ printf("No flag match: %08x & %08x = %08x\n", texture->get_flags(), flags, ((texture->get_flags() ^ flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)));
+ }
+ printf("\n");
+ checkidx++;
+ }
- if (d3d->hlsl->recording())
- d3d->hlsl->window_record();
+ printf("\n\n\n\n");*/
- // delete the device
- device_delete(d3d);
+ // Nothing found, check if we need to unregister something with HLSL
+ if (m_renderer->get_shaders()->enabled())
+ {
+ if (texinfo->width == 0 || texinfo->height == 0)
+ {
+ return NULL;
+ }
- // free the memory in the window
- global_free(d3d);
- window->drawdata = NULL;
-}
+ UINT32 prim_screen = texinfo->osddata >> 1;
+ UINT32 prim_page = texinfo->osddata & 1;
+ for (texture = m_renderer->get_texture_manager()->get_texlist(); texture != NULL; texture = texture->get_next())
+ {
+ UINT32 test_screen = texture->get_texinfo().osddata >> 1;
+ UINT32 test_page = texture->get_texinfo().osddata & 1;
+ if (test_screen != prim_screen || test_page != prim_page)
+ {
+ continue;
+ }
+ // Clear out our old texture reference
+ if (texture->get_hash() == hash &&
+ texture->get_texinfo().base == texinfo->base &&
+ ((texture->get_flags() ^ flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0 &&
+ (texture->get_texinfo().width != texinfo->width ||
+ texture->get_texinfo().height != texinfo->height))
+ {
+ m_renderer->get_shaders()->remove_render_target(texture);
+ }
+ }
+ }
-//============================================================
-// drawd3d_window_get_primitives
-//============================================================
+ return NULL;
+}
-static render_primitive_list *drawd3d_window_get_primitives(win_window_info *window)
+renderer::renderer(win_window_info *window)
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
- RECT client;
-
- GetClientRectExceptMenu(window->hwnd, &client, window->fullscreen);
- if (rect_width(&client) > 0 && rect_height(&client) > 0)
- {
- window->target->set_bounds(rect_width(&client), rect_height(&client), winvideo_monitor_get_aspect(window->monitor));
- window->target->set_max_update_rate((d3d->refresh == 0) ? d3d->origmode.RefreshRate : d3d->refresh);
- }
- return &window->target->get_primitives();
+ m_device = NULL;
+ m_restarting = false;
+ m_window = window;
+ m_shaders = NULL;
+ m_numverts = 0;
+ m_numpolys = 0;
}
+int renderer::initialize()
+{
+ // configure the adapter for the mode we want
+ if (config_adapter_mode())
+ return false;
+ // create the device immediately for the full screen case (defer for window mode)
+ if (m_window->fullscreen && device_create())
+ return false;
-//============================================================
-// drawd3d_window_draw
-//============================================================
+ m_texture_manager = global_alloc(texture_manager(this));
-static int drawd3d_window_draw(win_window_info *window, HDC dc, int update)
-{
- d3d_info *d3d = (d3d_info *)window->drawdata;
- render_primitive *prim;
- HRESULT result;
+ return true;
+}
+int renderer::pre_window_draw_check()
+{
// if we're in the middle of resizing, leave things alone
- if (window->resize_state == RESIZE_STATE_RESIZING)
+ if (m_window->resize_state == RESIZE_STATE_RESIZING)
return 0;
// if we're restarting the renderer, leave things alone
- if (d3d->restarting)
+ if (m_restarting)
{
- d3d->hlsl->toggle();
+ m_shaders->toggle();
// free all existing resources and re-create
- device_delete_resources(d3d);
- device_create_resources(d3d);
+ device_delete_resources();
+ device_create_resources();
- d3d->restarting = false;
+ m_restarting = false;
}
- // if we haven't been created, just punt
- if (d3d == NULL)
- return 1;
-
// if we have a device, check the cooperative level
- if (d3d->device != NULL)
+ if (m_device != NULL)
{
- int error = device_test_cooperative(d3d);
- if (error)
+ if (device_test_cooperative())
return 1;
}
// in window mode, we need to track the window size
- if (!window->fullscreen || d3d->device == NULL)
+ if (!m_window->fullscreen || m_device == NULL)
{
// if the size changes, skip this update since the render target will be out of date
- if (update_window_size(window))
+ if (update_window_size())
return 0;
// if we have no device, after updating the size, return an error so GDI can try
- if (d3d->device == NULL)
+ if (m_device == NULL)
return 1;
}
-mtlog_add("drawd3d_window_draw: begin");
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
-
- d3d->hlsl->begin_frame();
+ return -1;
+}
- // first update any textures
- window->primlist->acquire_lock();
- for (prim = window->primlist->first(); prim != NULL; prim = prim->next())
+void texture_manager::update_textures()
+{
+ for (render_primitive *prim = m_renderer->get_window()->primlist->first(); prim != NULL; prim = prim->next())
{
if (prim->texture.base != NULL)
{
- texture_update(d3d, prim);
+ texture_info *texture = find_texinfo(&prim->texture, prim->flags);
+ if (texture == NULL)
+ {
+ // if there isn't one, create a new texture
+ global_alloc(texture_info(this, &prim->texture, prim->flags));
+ }
+ else
+ {
+ // if there is one, but with a different seqid, copy the data
+ if (texture->get_texinfo().seqid != prim->texture.seqid)
+ {
+ texture->set_data(&prim->texture, prim->flags);
+ texture->get_texinfo().seqid = prim->texture.seqid;
+ }
+ }
}
- else if(d3d->hlsl->vector_enabled() && PRIMFLAG_GET_VECTORBUF(prim->flags))
+ else if(m_renderer->get_shaders()->vector_enabled() && PRIMFLAG_GET_VECTORBUF(prim->flags))
{
- if (!d3d->hlsl->get_vector_target())
+ if (!m_renderer->get_shaders()->get_vector_target())
{
- d3d->hlsl->create_vector_target(prim);
+ m_renderer->get_shaders()->create_vector_target(prim);
}
}
}
+}
+
+void renderer::begin_frame()
+{
+ HRESULT result = (*d3dintf->device.clear)(m_device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device clear call\n", (int)result);
+
+ m_shaders->begin_frame();
+
+ m_window->primlist->acquire_lock();
+
+ // first update any textures
+ m_texture_manager->update_textures();
// begin the scene
mtlog_add("drawd3d_window_draw: begin_scene");
- result = (*d3dintf->device.begin_scene)(d3d->device);
+ result = (*d3dintf->device.begin_scene)(m_device);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result);
- d3d->lockedbuf = NULL;
+ m_lockedbuf = NULL;
- // loop over primitives
- if(d3d->hlsl->enabled())
+ if(m_shaders->enabled())
{
- d3d->hlsl_buf = (void*)primitive_alloc(d3d, 6);
- d3d->hlsl->init_fsfx_quad(d3d->hlsl_buf);
+ m_hlsl_buf = (void*)mesh_alloc(6);
+ m_shaders->init_fsfx_quad(m_hlsl_buf);
}
-mtlog_add("drawd3d_window_draw: count lines");
- int line_count = 0;
- for (prim = window->primlist->first(); prim != NULL; prim = prim->next())
+ m_line_count = 0;
+ // loop over primitives
+ for (render_primitive *prim = m_window->primlist->first(); prim != NULL; prim = prim->next())
if (prim->type == render_primitive::LINE && PRIMFLAG_GET_VECTOR(prim->flags))
- line_count++;
+ m_line_count++;
+}
+
+void renderer::process_primitives()
+{
+ if (m_line_count && m_shaders->enabled() && d3dintf->post_fx_available)
+ {
+ batch_vectors();
+ }
-mtlog_add("drawd3d_window_draw: primitive loop begin");
// Rotating index for vector time offsets
- static int start_index = 0;
- int line_index = 0;
- windows_options &options = downcast<windows_options &>(window->machine().options());
- float period = options.screen_vector_time_period();
- for (prim = window->primlist->first(); prim != NULL; prim = prim->next())
+ for (render_primitive *prim = m_window->primlist->first(); prim != NULL; prim = prim->next())
{
switch (prim->type)
{
case render_primitive::LINE:
if (PRIMFLAG_GET_VECTOR(prim->flags))
{
- if (period == 0.0f || line_count == 0)
- {
- draw_line(d3d, prim, 1.0f);
- }
- else
- {
- draw_line(d3d, prim, (float)(start_index + line_index) / ((float)line_count * period));
- line_index++;
- }
+ continue;
}
else
{
- draw_line(d3d, prim, 0.0f);
+ draw_line(prim);
}
break;
case render_primitive::QUAD:
- draw_quad(d3d, prim);
+ draw_quad(prim);
break;
default:
throw emu_fatalerror("Unexpected render_primitive type");
}
}
- start_index += (int)((float)line_index * period);
- if (line_count > 0)
+
+ if (m_line_count && !(m_shaders->enabled() && d3dintf->post_fx_available))
{
- start_index %= line_count;
+ batch_vectors();
}
-mtlog_add("drawd3d_window_draw: primitive loop end");
- window->primlist->release_lock();
+}
+
+void renderer::end_frame()
+{
+ m_window->primlist->release_lock();
// flush any pending polygons
-mtlog_add("drawd3d_window_draw: flush_pending begin");
- primitive_flush_pending(d3d);
-mtlog_add("drawd3d_window_draw: flush_pending end");
+ primitive_flush_pending();
- d3d->hlsl->end_frame();
+ m_shaders->end_frame();
// finish the scene
-mtlog_add("drawd3d_window_draw: end_scene begin");
- result = (*d3dintf->device.end_scene)(d3d->device);
-mtlog_add("drawd3d_window_draw: end_scene end");
+ HRESULT result = (*d3dintf->device.end_scene)(m_device);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device end_scene call\n", (int)result);
// present the current buffers
-mtlog_add("drawd3d_window_draw: present begin");
- result = (*d3dintf->device.present)(d3d->device, NULL, NULL, NULL, NULL, 0);
-mtlog_add("drawd3d_window_draw: present end");
+ result = (*d3dintf->device.present)(m_device, NULL, NULL, NULL, NULL, 0);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device present call\n", (int)result);
-
- return 0;
}
-
-
//============================================================
// device_create
//============================================================
-static int device_create(win_window_info *window)
+int renderer::device_create()
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
- HRESULT result;
- int verify;
-
// if a device exists, free it
- if (d3d->device != NULL)
- device_delete(d3d);
+ if (m_device != NULL)
+ device_delete();
// verify the caps
- verify = device_verify_caps(d3d, window);
+ int verify = device_verify_caps();
if (verify == 2)
{
mame_printf_error("Error: Device does not meet minimum requirements for Direct3D rendering\n");
@@ -732,37 +939,25 @@ static int device_create(win_window_info *window)
mame_printf_warning("Warning: Device may not perform well for Direct3D rendering\n");
// verify texture formats
- result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8);
+ HRESULT result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8);
if (result != D3D_OK)
{
mame_printf_error("Error: A8R8G8B8 format textures not supported\n");
return 1;
}
- // pick a YUV texture format
- d3d->yuv_format = D3DFMT_UYVY;
- result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_UYVY);
- if (result != D3D_OK)
- {
- d3d->yuv_format = D3DFMT_YUY2;
- result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, 0, D3DRTYPE_TEXTURE, D3DFMT_YUY2);
- if (result != D3D_OK)
- d3d->yuv_format = D3DFMT_A8R8G8B8;
- }
- mame_printf_verbose("Direct3D: YUV format = %s\n", (d3d->yuv_format == D3DFMT_YUY2) ? "YUY2" : (d3d->yuv_format == D3DFMT_UYVY) ? "UYVY" : "RGB");
-
try_again:
// try for XRGB first
- d3d->screen_format = D3DFMT_X8R8G8B8;
- result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, d3d->dynamic_supported ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, d3d->screen_format);
+ m_screen_format = D3DFMT_X8R8G8B8;
+ result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format);
if (result != D3D_OK)
{
// if not, try for ARGB
- d3d->screen_format = D3DFMT_A8R8G8B8;
- result = (*d3dintf->d3d.check_device_format)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, d3d->dynamic_supported ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, d3d->screen_format);
- if (result != D3D_OK && d3d->dynamic_supported)
+ m_screen_format = D3DFMT_A8R8G8B8;
+ result = (*d3dintf->d3d.check_device_format)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0, D3DRTYPE_TEXTURE, m_screen_format);
+ if (result != D3D_OK && m_texture_manager->is_dynamic_supported())
{
- d3d->dynamic_supported = FALSE;
+ m_texture_manager->set_dynamic_supported(FALSE);
goto try_again;
}
if (result != D3D_OK)
@@ -773,33 +968,34 @@ try_again:
}
// initialize the D3D presentation parameters
- memset(&d3d->presentation, 0, sizeof(d3d->presentation));
- d3d->presentation.BackBufferWidth = d3d->width;
- d3d->presentation.BackBufferHeight = d3d->height;
- d3d->presentation.BackBufferFormat = d3d->pixformat;
- d3d->presentation.BackBufferCount = video_config.triplebuf ? 2 : 1;
- d3d->presentation.MultiSampleType = D3DMULTISAMPLE_NONE;
- d3d->presentation.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3d->presentation.hDeviceWindow = window->hwnd;
- d3d->presentation.Windowed = !window->fullscreen || win_has_menu(window);
- d3d->presentation.EnableAutoDepthStencil = FALSE;
- d3d->presentation.AutoDepthStencilFormat = D3DFMT_D16;
- d3d->presentation.Flags = 0;
- d3d->presentation.FullScreen_RefreshRateInHz = d3d->refresh;
- d3d->presentation.PresentationInterval = ((video_config.triplebuf && window->fullscreen) || video_config.waitvsync || video_config.syncrefresh) ?
- D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
+ memset(&m_presentation, 0, sizeof(m_presentation));
+ m_presentation.BackBufferWidth = m_width;
+ m_presentation.BackBufferHeight = m_height;
+ m_presentation.BackBufferFormat = m_pixformat;
+ m_presentation.BackBufferCount = video_config.triplebuf ? 2 : 1;
+ m_presentation.MultiSampleType = D3DMULTISAMPLE_NONE;
+ m_presentation.SwapEffect = D3DSWAPEFFECT_DISCARD;
+ m_presentation.hDeviceWindow = m_window->hwnd;
+ m_presentation.Windowed = !m_window->fullscreen || win_has_menu(m_window);
+ m_presentation.EnableAutoDepthStencil = FALSE;
+ m_presentation.AutoDepthStencilFormat = D3DFMT_D16;
+ m_presentation.Flags = 0;
+ m_presentation.FullScreen_RefreshRateInHz = m_refresh;
+ m_presentation.PresentationInterval = ((video_config.triplebuf && m_window->fullscreen) ||
+ video_config.waitvsync || video_config.syncrefresh) ?
+ D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
// create the D3D device
- result = (*d3dintf->d3d.create_device)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, win_window_list->hwnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &d3d->presentation, &d3d->device);
+ result = (*d3dintf->d3d.create_device)(d3dintf, m_adapter, D3DDEVTYPE_HAL, win_window_list->hwnd,
+ D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_FPU_PRESERVE, &m_presentation, &m_device);
if (result != D3D_OK)
{
// if we got a "DEVICELOST" error, it may be transitory; count it and only fail if
// we exceed a threshold
if (result == D3DERR_DEVICELOST)
{
- d3d->create_error_count++;
- if (d3d->create_error_count < 10)
+ m_create_error_count++;
+ if (m_create_error_count < 10)
return 0;
}
@@ -807,44 +1003,42 @@ try_again:
mame_printf_error("Unable to create the Direct3D device (%08X)\n", (UINT32)result);
return 1;
}
- d3d->create_error_count = 0;
- mame_printf_verbose("Direct3D: Device created at %dx%d\n", d3d->width, d3d->height);
-
- // set the max texture size
- window->target->set_max_texture_size(d3d->texture_max_width, d3d->texture_max_height);
- mame_printf_verbose("Direct3D: Max texture size = %dx%d\n", (int)d3d->texture_max_width, (int)d3d->texture_max_height);
+ m_create_error_count = 0;
+ mame_printf_verbose("Direct3D: Device created at %dx%d\n", m_width, m_height);
// set the gamma if we need to
- if (window->fullscreen)
+ if (m_window->fullscreen)
{
// only set the gamma if it's not 1.0f
- windows_options &options = downcast<windows_options &>(window->machine().options());
+ windows_options &options = downcast<windows_options &>(m_window->machine().options());
float brightness = options.full_screen_brightness();
float contrast = options.full_screen_contrast();
float gamma = options.full_screen_gamma();
if (brightness != 1.0f || contrast != 1.0f || gamma != 1.0f)
{
// warn if we can't do it
- if (!d3d->gamma_supported)
+ if (!m_gamma_supported)
+ {
mame_printf_warning("Direct3D: Warning - device does not support full screen gamma correction.\n");
+ }
else
{
- D3DGAMMARAMP ramp;
- int i;
-
// create a standard ramp and set it
- for (i = 0; i < 256; i++)
+ D3DGAMMARAMP ramp;
+ for (int i = 0; i < 256; i++)
+ {
ramp.red[i] = ramp.green[i] = ramp.blue[i] = apply_brightness_contrast_gamma(i, brightness, contrast, gamma) << 8;
- (*d3dintf->device.set_gamma_ramp)(d3d->device, 0, &ramp);
+ }
+ (*d3dintf->device.set_gamma_ramp)(m_device, 0, &ramp);
}
}
}
- int ret = d3d->hlsl->create_resources(false);
+ int ret = m_shaders->create_resources(false);
if (ret != 0)
return ret;
- return device_create_resources(d3d);
+ return device_create_resources();
}
@@ -853,15 +1047,14 @@ try_again:
// device_create_resources
//============================================================
-static int device_create_resources(d3d_info *d3d)
+int renderer::device_create_resources()
{
- HRESULT result;
-
// allocate a vertex buffer to use
- result = (*d3dintf->device.create_vertex_buffer)(d3d->device,
- sizeof(d3d_vertex) * VERTEX_BUFFER_SIZE,
+ HRESULT result = (*d3dintf->device.create_vertex_buffer)(m_device,
+ sizeof(vertex) * VERTEX_BUFFER_SIZE,
D3DUSAGE_DYNAMIC | D3DUSAGE_SOFTWAREPROCESSING | D3DUSAGE_WRITEONLY,
- VERTEX_BASE_FORMAT | ((d3d->hlsl->enabled() && d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW), D3DPOOL_DEFAULT, &d3d->vertexbuf);
+ VERTEX_BASE_FORMAT | ((m_shaders->enabled() && d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW),
+ D3DPOOL_DEFAULT, &m_vertexbuf);
if (result != D3D_OK)
{
printf("Error creating vertex buffer (%08X)", (UINT32)result);
@@ -869,7 +1062,8 @@ static int device_create_resources(d3d_info *d3d)
}
// set the vertex format
- result = (*d3dintf->device.set_vertex_format)(d3d->device, (D3DFORMAT)(VERTEX_BASE_FORMAT | ((d3d->hlsl->enabled() && d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW)));
+ result = (*d3dintf->device.set_vertex_format)(m_device, (D3DFORMAT)(VERTEX_BASE_FORMAT | ((m_shaders->enabled() &&
+ d3dintf->post_fx_available) ? D3DFVF_XYZW : D3DFVF_XYZRHW)));
if (result != D3D_OK)
{
mame_printf_error("Error setting vertex format (%08X)", (UINT32)result);
@@ -877,69 +1071,38 @@ static int device_create_resources(d3d_info *d3d)
}
// set the fixed render state
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ZENABLE, D3DZB_FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_FILLMODE, D3DFILL_SOLID);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_SHADEMODE, D3DSHADE_FLAT);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ZWRITEENABLE, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ALPHATESTENABLE, TRUE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_LASTPIXEL, TRUE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_CULLMODE, D3DCULL_NONE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ZFUNC, D3DCMP_LESS);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ALPHAREF, 0);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_DITHERENABLE, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_FOGENABLE, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_SPECULARENABLE, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_STENCILENABLE, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_WRAP0, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_CLIPPING, TRUE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_LIGHTING, FALSE);
- result = (*d3dintf->device.set_render_state)(d3d->device, D3DRS_COLORVERTEX, TRUE);
-
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
- result = (*d3dintf->device.set_texture_stage_state)(d3d->device, 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZENABLE, D3DZB_FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_FILLMODE, D3DFILL_SOLID);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SHADEMODE, D3DSHADE_FLAT);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZWRITEENABLE, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHATESTENABLE, TRUE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_LASTPIXEL, TRUE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_CULLMODE, D3DCULL_NONE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ZFUNC, D3DCMP_LESS);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHAREF, 0);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_ALPHAFUNC, D3DCMP_GREATER);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_DITHERENABLE, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_FOGENABLE, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_SPECULARENABLE, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_STENCILENABLE, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_WRAP0, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_CLIPPING, TRUE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_LIGHTING, FALSE);
+ result = (*d3dintf->device.set_render_state)(m_device, D3DRS_COLORVERTEX, TRUE);
+
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
+ result = (*d3dintf->device.set_texture_stage_state)(m_device, 1, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
// reset the local states to force updates
- reset_render_states(d3d);
+ reset_render_states();
// clear the buffer
- result = (*d3dintf->device.clear)(d3d->device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
- result = (*d3dintf->device.present)(d3d->device, NULL, NULL, NULL, NULL, 0);
-
- if (d3d->default_bitmap.valid())
- {
- render_texinfo texture;
-
- // fake in the basic data so it looks like it came from render.c
- texture.base = d3d->default_bitmap.raw_pixptr(0);
- texture.rowpixels = d3d->default_bitmap.rowpixels();
- texture.width = d3d->default_bitmap.width();
- texture.height = d3d->default_bitmap.height();
- texture.palette = NULL;
- texture.seqid = 0;
-
- // now create it
- d3d->default_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32));
- }
-
- // experimental: if we have a vector bitmap, create a texture for it
- if (d3d->vector_bitmap.valid())
- {
- render_texinfo texture;
+ result = (*d3dintf->device.clear)(m_device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0,0,0,0), 0, 0);
+ result = (*d3dintf->device.present)(m_device, NULL, NULL, NULL, NULL, 0);
- // fake in the basic data so it looks like it came from render.c
- texture.base = &d3d->vector_bitmap.pix32(0);
- texture.rowpixels = d3d->vector_bitmap.rowpixels();
- texture.width = d3d->vector_bitmap.width();
- texture.height = d3d->vector_bitmap.height();
- texture.palette = NULL;
- texture.seqid = 0;
-
- // now create it
- d3d->vector_texture = texture_create(d3d, &texture, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32));
- }
+ m_texture_manager->create_resources();
return 0;
}
@@ -950,62 +1113,45 @@ static int device_create_resources(d3d_info *d3d)
// device_delete
//============================================================
-static void device_delete(d3d_info *d3d)
+renderer::~renderer()
+{
+ device_delete();
+}
+
+void renderer::device_delete()
{
// free our effects
- d3d->hlsl->delete_resources(false);
+ m_shaders->delete_resources(false);
// delete the HLSL interface
- global_free(d3d->hlsl);
+ global_free(m_shaders);
// free our base resources
- device_delete_resources(d3d);
+ device_delete_resources();
+
+ if (m_texture_manager != NULL)
+ {
+ global_free(m_texture_manager);
+ }
+ m_texture_manager = NULL;
// free the device itself
- if (d3d->device != NULL)
- (*d3dintf->device.release)(d3d->device);
- d3d->device = NULL;
+ if (m_device != NULL)
+ (*d3dintf->device.release)(m_device);
+ m_device = NULL;
}
-
-
//============================================================
// device_delete_resources
//============================================================
-static void device_delete_resources(d3d_info *d3d)
+void renderer::device_delete_resources()
{
- // free all textures
- while (d3d->texlist != NULL)
- {
- d3d_texture_info *tex = d3d->texlist;
- d3d->texlist = tex->next;
- if (tex->d3dfinaltex != NULL)
- {
- if (tex->d3dtex == tex->d3dfinaltex) tex->d3dtex = NULL;
- (*d3dintf->texture.release)(tex->d3dfinaltex);
- tex->d3dfinaltex = NULL;
- }
- if (tex->d3dtex != NULL)
- {
- (*d3dintf->texture.release)(tex->d3dtex);
- tex->d3dtex = NULL;
- }
- if (tex->d3dsurface != NULL)
- {
- (*d3dintf->surface.release)(tex->d3dsurface);
- tex->d3dsurface = NULL;
- }
- global_free(tex);
- }
-
+ m_texture_manager->delete_resources();
// free the vertex buffer
- if (d3d->vertexbuf != NULL)
- (*d3dintf->vertexbuf.release)(d3d->vertexbuf);
- d3d->vertexbuf = NULL;
-
- global_free(d3d->default_texture);
- d3d->default_texture = NULL;
+ if (m_vertexbuf != NULL)
+ (*d3dintf->vertexbuf.release)(m_vertexbuf);
+ m_vertexbuf = NULL;
}
@@ -1014,26 +1160,15 @@ static void device_delete_resources(d3d_info *d3d)
// device_verify_caps
//============================================================
-static int device_verify_caps(d3d_info *d3d, win_window_info *window)
+int renderer::device_verify_caps()
{
int retval = 0;
- HRESULT result;
- DWORD tempcaps;
-
- // fetch a few core caps
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_CAPS, &d3d->texture_caps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_ASPECT, &d3d->texture_max_aspect);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_WIDTH, &d3d->texture_max_width);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_MAX_TEXTURE_HEIGHT, &d3d->texture_max_height);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- d3d->hlsl = global_alloc_clear(hlsl_info);
- d3d->hlsl->init(d3dintf, window);
+ m_shaders = global_alloc_clear(shaders);
+ m_shaders->init(d3dintf, m_window);
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_MAX_PS30_INSN_SLOTS, &tempcaps);
+ DWORD tempcaps;
+ HRESULT result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_MAX_PS30_INSN_SLOTS, &tempcaps);
if (result != D3D_OK) mame_printf_verbose("Direct3D Error %08X during get_caps_dword call\n", (int)result);
if(tempcaps < 512)
{
@@ -1042,7 +1177,7 @@ static int device_verify_caps(d3d_info *d3d, win_window_info *window)
}
// verify presentation capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_PRESENTATION_INTERVALS, &tempcaps);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_PRESENTATION_INTERVALS, &tempcaps);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
if (!(tempcaps & D3DPRESENT_INTERVAL_IMMEDIATE))
{
@@ -1056,7 +1191,7 @@ static int device_verify_caps(d3d_info *d3d, win_window_info *window)
}
// verify device capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_DEV_CAPS, &tempcaps);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_DEV_CAPS, &tempcaps);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
if (!(tempcaps & D3DDEVCAPS_CANRENDERAFTERFLIP))
{
@@ -1069,86 +1204,8 @@ static int device_verify_caps(d3d_info *d3d, win_window_info *window)
retval = 1;
}
- // verify source blend capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_SRCBLEND_CAPS, &tempcaps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- if (!(tempcaps & D3DPBLENDCAPS_SRCALPHA))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support source alpha blending with source alpha\n");
- retval = 2;
- }
- if (!(tempcaps & D3DPBLENDCAPS_DESTCOLOR))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support source alpha blending with destination color\n");
- retval = 2;
- }
-
- // verify destination blend capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_DSTBLEND_CAPS, &tempcaps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- if (!(tempcaps & D3DPBLENDCAPS_ZERO))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support dest alpha blending with zero\n");
- retval = 2;
- }
- if (!(tempcaps & D3DPBLENDCAPS_ONE))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support dest alpha blending with one\n");
- retval = 2;
- }
- if (!(tempcaps & D3DPBLENDCAPS_INVSRCALPHA))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support dest alpha blending with inverted source alpha\n");
- retval = 2;
- }
-
- // verify texture capabilities
- if (!(d3d->texture_caps & D3DPTEXTURECAPS_ALPHA))
- {
- mame_printf_verbose("Direct3D: Error - Device does not support texture alpha\n");
- retval = 2;
- }
-
- // verify texture filter capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_FILTER_CAPS, &tempcaps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- if (!(tempcaps & D3DPTFILTERCAPS_MAGFPOINT))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support point-sample texture filtering for magnification\n");
- retval = 1;
- }
- if (!(tempcaps & D3DPTFILTERCAPS_MAGFLINEAR))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support bilinear texture filtering for magnification\n");
- retval = 1;
- }
- if (!(tempcaps & D3DPTFILTERCAPS_MINFPOINT))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support point-sample texture filtering for minification\n");
- retval = 1;
- }
- if (!(tempcaps & D3DPTFILTERCAPS_MINFLINEAR))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support bilinear texture filtering for minification\n");
- retval = 1;
- }
-
- // verify texture addressing capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_ADDRESS_CAPS, &tempcaps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- if (!(tempcaps & D3DPTADDRESSCAPS_CLAMP))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support texture clamping\n");
- retval = 1;
- }
- if (!(tempcaps & D3DPTADDRESSCAPS_WRAP))
- {
- mame_printf_verbose("Direct3D: Warning - Device does not support texture wrapping\n");
- retval = 1;
- }
-
// verify texture operation capabilities
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_OP_CAPS, &tempcaps);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_TEXTURE_OP_CAPS, &tempcaps);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
if (!(tempcaps & D3DTEXOPCAPS_MODULATE))
{
@@ -1157,21 +1214,12 @@ static int device_verify_caps(d3d_info *d3d, win_window_info *window)
}
// set a simpler flag to indicate mod2x and mod4x texture modes
- d3d->mod2x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE2X) != 0);
- d3d->mod4x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE4X) != 0);
-
- // set a simpler flag to indicate we can use a gamma ramp
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_CAPS2, &tempcaps);
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- d3d->dynamic_supported = ((tempcaps & D3DCAPS2_DYNAMICTEXTURES) != 0);
- d3d->gamma_supported = ((tempcaps & D3DCAPS2_FULLSCREENGAMMA) != 0);
- if (d3d->dynamic_supported) mame_printf_verbose("Direct3D: Using dynamic textures\n");
+ m_mod2x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE2X) != 0);
+ m_mod4x_supported = ((tempcaps & D3DTEXOPCAPS_MODULATE4X) != 0);
- // set a simpler flag to indicate we can use StretchRect
- result = (*d3dintf->d3d.get_caps_dword)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, CAPS_STRETCH_RECT_FILTER, &tempcaps);
+ result = (*d3dintf->d3d.get_caps_dword)(d3dintf, m_adapter, D3DDEVTYPE_HAL, CAPS_CAPS2, &tempcaps);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during get_caps_dword call\n", (int)result);
- d3d->stretch_supported = ((tempcaps & D3DPTFILTERCAPS_MAGFPOINT) != 0);
- if (d3d->stretch_supported && video_config.prescale > 1) mame_printf_verbose("Direct3D: Using StretchRect for prescaling\n");
+ m_gamma_supported = ((tempcaps & D3DCAPS2_FULLSCREENGAMMA) != 0);
return retval;
}
@@ -1182,12 +1230,10 @@ static int device_verify_caps(d3d_info *d3d, win_window_info *window)
// device_test_cooperative
//============================================================
-static int device_test_cooperative(d3d_info *d3d)
+int renderer::device_test_cooperative()
{
- HRESULT result;
-
// check our current status; if we lost the device, punt to GDI
- result = (*d3dintf->device.test_cooperative_level)(d3d->device);
+ HRESULT result = (*d3dintf->device.test_cooperative_level)(m_device);
if (result == D3DERR_DEVICELOST)
return 1;
@@ -1197,9 +1243,9 @@ static int device_test_cooperative(d3d_info *d3d)
mame_printf_verbose("Direct3D: resetting device\n");
// free all existing resources and call reset on the device
- device_delete_resources(d3d);
- d3d->hlsl->delete_resources(true);
- result = (*d3dintf->device.reset)(d3d->device, &d3d->presentation);
+ device_delete_resources();
+ m_shaders->delete_resources(true);
+ result = (*d3dintf->device.reset)(m_device, &m_presentation);
// if it didn't work, punt to GDI
if (result != D3D_OK)
@@ -1209,17 +1255,17 @@ static int device_test_cooperative(d3d_info *d3d)
}
// try to create the resources again; if that didn't work, delete the whole thing
- if (device_create_resources(d3d))
+ if (device_create_resources())
{
mame_printf_verbose("Direct3D: failed to recreate resources for device; failing permanently\n");
- device_delete(d3d);
+ device_delete();
return 1;
}
- if (d3d->hlsl->create_resources(true))
+ if (m_shaders->create_resources(true))
{
mame_printf_verbose("Direct3D: failed to recreate HLSL resources for device; failing permanently\n");
- device_delete(d3d);
+ device_delete();
return 1;
}
}
@@ -1232,50 +1278,48 @@ static int device_test_cooperative(d3d_info *d3d)
// config_adapter_mode
//============================================================
-static int config_adapter_mode(win_window_info *window)
+int renderer::config_adapter_mode()
{
- d3d_adapter_identifier identifier;
- d3d_info *d3d = (d3d_info *)window->drawdata;
- HRESULT result;
+ adapter_identifier identifier;
// choose the monitor number
- d3d->adapter = get_adapter_for_monitor(d3d, window->monitor);
+ m_adapter = get_adapter_for_monitor();
// get the identifier
- result = (*d3dintf->d3d.get_adapter_identifier)(d3dintf, d3d->adapter, 0, &identifier);
+ HRESULT result = (*d3dintf->d3d.get_adapter_identifier)(d3dintf, m_adapter, 0, &identifier);
if (result != D3D_OK)
{
- mame_printf_error("Error getting identifier for adapter #%d\n", d3d->adapter);
+ mame_printf_error("Error getting identifier for adapter #%d\n", m_adapter);
return 1;
}
- mame_printf_verbose("Direct3D: Configuring adapter #%d = %s\n", d3d->adapter, identifier.Description);
+ mame_printf_verbose("Direct3D: Configuring adapter #%d = %s\n", m_adapter, identifier.Description);
// get the current display mode
- result = (*d3dintf->d3d.get_adapter_display_mode)(d3dintf, d3d->adapter, &d3d->origmode);
+ result = (*d3dintf->d3d.get_adapter_display_mode)(d3dintf, m_adapter, &m_origmode);
if (result != D3D_OK)
{
- mame_printf_error("Error getting mode for adapter #%d\n", d3d->adapter);
+ mame_printf_error("Error getting mode for adapter #%d\n", m_adapter);
return 1;
}
// choose a resolution: window mode case
- if (!window->fullscreen || !video_config.switchres || win_has_menu(window))
+ if (!m_window->fullscreen || !video_config.switchres || win_has_menu(m_window))
{
RECT client;
// bounds are from the window client rect
- GetClientRectExceptMenu(window->hwnd, &client, window->fullscreen);
- d3d->width = client.right - client.left;
- d3d->height = client.bottom - client.top;
+ GetClientRectExceptMenu(m_window->hwnd, &client, m_window->fullscreen);
+ m_width = client.right - client.left;
+ m_height = client.bottom - client.top;
// pix format is from the current mode
- d3d->pixformat = d3d->origmode.Format;
- d3d->refresh = 0;
+ m_pixformat = m_origmode.Format;
+ m_refresh = 0;
// make sure it's a pixel format we can get behind
- if (d3d->pixformat != D3DFMT_X1R5G5B5 && d3d->pixformat != D3DFMT_R5G6B5 && d3d->pixformat != D3DFMT_X8R8G8B8)
+ if (m_pixformat != D3DFMT_X1R5G5B5 && m_pixformat != D3DFMT_R5G6B5 && m_pixformat != D3DFMT_X8R8G8B8)
{
- char *utf8_device = utf8_from_tstring(window->monitor->info.szDevice);
+ char *utf8_device = utf8_from_tstring(m_window->monitor->info.szDevice);
if (utf8_device != NULL)
{
mame_printf_error("Device %s currently in an unsupported mode\n", utf8_device);
@@ -1289,21 +1333,21 @@ static int config_adapter_mode(win_window_info *window)
else
{
// default to the current mode exactly
- d3d->width = d3d->origmode.Width;
- d3d->height = d3d->origmode.Height;
- d3d->pixformat = d3d->origmode.Format;
- d3d->refresh = d3d->origmode.RefreshRate;
+ m_width = m_origmode.Width;
+ m_height = m_origmode.Height;
+ m_pixformat = m_origmode.Format;
+ m_refresh = m_origmode.RefreshRate;
// if we're allowed to switch resolutions, override with something better
if (video_config.switchres)
- pick_best_mode(window);
+ pick_best_mode();
}
// see if we can handle the device type
- result = (*d3dintf->d3d.check_device_type)(d3dintf, d3d->adapter, D3DDEVTYPE_HAL, d3d->pixformat, d3d->pixformat, !window->fullscreen);
+ result = (*d3dintf->d3d.check_device_type)(d3dintf, m_adapter, D3DDEVTYPE_HAL, m_pixformat, m_pixformat, !m_window->fullscreen);
if (result != D3D_OK)
{
- char *utf8_device = utf8_from_tstring(window->monitor->info.szDevice);
+ char *utf8_device = utf8_from_tstring(m_window->monitor->info.szDevice);
if (utf8_device != NULL)
{
mame_printf_error("Proposed video mode not supported on device %s\n", utf8_device);
@@ -1320,22 +1364,21 @@ static int config_adapter_mode(win_window_info *window)
// get_adapter_for_monitor
//============================================================
-static int get_adapter_for_monitor(d3d_info *d3d, win_monitor_info *monitor)
+int renderer::get_adapter_for_monitor()
{
int maxadapter = (*d3dintf->d3d.get_adapter_count)(d3dintf);
- int adapternum;
// iterate over adapters until we error or find a match
- for (adapternum = 0; adapternum < maxadapter; adapternum++)
+ for (int adapternum = 0; adapternum < maxadapter; adapternum++)
{
- HMONITOR curmonitor;
-
// get the monitor for this adapter
- curmonitor = (*d3dintf->d3d.get_adapter_monitor)(d3dintf, adapternum);
+ HMONITOR curmonitor = (*d3dintf->d3d.get_adapter_monitor)(d3dintf, adapternum);
// if we match the proposed monitor, this is it
- if (curmonitor == monitor->handle)
+ if (curmonitor == m_window->monitor->handle)
+ {
return adapternum;
+ }
}
// default to the default
@@ -1348,44 +1391,39 @@ static int get_adapter_for_monitor(d3d_info *d3d, win_monitor_info *monitor)
// pick_best_mode
//============================================================
-static void pick_best_mode(win_window_info *window)
+void renderer::pick_best_mode()
{
double target_refresh = 60.0;
- INT32 target_width, target_height;
- d3d_info *d3d = (d3d_info *)window->drawdata;
INT32 minwidth, minheight;
float best_score = 0.0f;
- int maxmodes;
- int modenum;
// determine the refresh rate of the primary screen
- const screen_device *primary_screen = window->machine().config().first_screen();
+ const screen_device *primary_screen = m_window->machine().config().first_screen();
if (primary_screen != NULL)
+ {
target_refresh = ATTOSECONDS_TO_HZ(primary_screen->refresh_attoseconds());
+ }
// determine the minimum width/height for the selected target
// note: technically we should not be calling this from an alternate window
// thread; however, it is only done during init time, and the init code on
// the main thread is waiting for us to finish, so it is safe to do so here
- window->target->compute_minimum_size(minwidth, minheight);
+ m_window->target->compute_minimum_size(minwidth, minheight);
// use those as the target for now
- target_width = minwidth;
- target_height = minheight;
+ INT32 target_width = minwidth;
+ INT32 target_height = minheight;
// determine the maximum number of modes
- maxmodes = (*d3dintf->d3d.get_adapter_mode_count)(d3dintf, d3d->adapter, D3DFMT_X8R8G8B8);
+ int maxmodes = (*d3dintf->d3d.get_adapter_mode_count)(d3dintf, m_adapter, D3DFMT_X8R8G8B8);
// enumerate all the video modes and find the best match
mame_printf_verbose("Direct3D: Selecting video mode...\n");
- for (modenum = 0; modenum < maxmodes; modenum++)
+ for (int modenum = 0; modenum < maxmodes; modenum++)
{
- float size_score, refresh_score, final_score;
- D3DDISPLAYMODE mode;
- HRESULT result;
-
// check this mode
- result = (*d3dintf->d3d.enum_adapter_modes)(d3dintf, d3d->adapter, D3DFMT_X8R8G8B8, modenum, &mode);
+ D3DDISPLAYMODE mode;
+ HRESULT result = (*d3dintf->d3d.enum_adapter_modes)(d3dintf, m_adapter, D3DFMT_X8R8G8B8, modenum, &mode);
if (result != D3D_OK)
break;
@@ -1394,7 +1432,7 @@ static void pick_best_mode(win_window_info *window)
continue;
// compute initial score based on difference between target and current
- size_score = 1.0f / (1.0f + fabs((float)(mode.Width - target_width)) + fabs((float)(mode.Height - target_height)));
+ float size_score = 1.0f / (1.0f + fabs((float)(mode.Width - target_width)) + fabs((float)(mode.Height - target_height)));
// if the mode is too small, give a big penalty
if (mode.Width < minwidth || mode.Height < minheight)
@@ -1405,35 +1443,35 @@ static void pick_best_mode(win_window_info *window)
size_score *= 0.1f;
// if we're looking for a particular mode, that's a winner
- if (mode.Width == window->maxwidth && mode.Height == window->maxheight)
+ if (mode.Width == m_window->maxwidth && mode.Height == m_window->maxheight)
size_score = 2.0f;
// compute refresh score
- refresh_score = 1.0f / (1.0f + fabs((double)mode.RefreshRate - target_refresh));
+ float refresh_score = 1.0f / (1.0f + fabs((double)mode.RefreshRate - target_refresh));
// if refresh is smaller than we'd like, it only scores up to 0.1
if ((double)mode.RefreshRate < target_refresh)
refresh_score *= 0.1f;
// if we're looking for a particular refresh, make sure it matches
- if (mode.RefreshRate == window->refresh)
+ if (mode.RefreshRate == m_window->refresh)
refresh_score = 2.0f;
// weight size and refresh equally
- final_score = size_score + refresh_score;
+ float final_score = size_score + refresh_score;
// best so far?
mame_printf_verbose(" %4dx%4d@%3dHz -> %f\n", mode.Width, mode.Height, mode.RefreshRate, final_score * 1000.0f);
if (final_score > best_score)
{
best_score = final_score;
- d3d->width = mode.Width;
- d3d->height = mode.Height;
- d3d->pixformat = mode.Format;
- d3d->refresh = mode.RefreshRate;
+ m_width = mode.Width;
+ m_height = mode.Height;
+ m_pixformat = mode.Format;
+ m_refresh = mode.RefreshRate;
}
}
- mame_printf_verbose("Direct3D: Mode selected = %4dx%4d@%3dHz\n", d3d->width, d3d->height, d3d->refresh);
+ mame_printf_verbose("Direct3D: Mode selected = %4dx%4d@%3dHz\n", m_width, m_height, m_refresh);
}
@@ -1442,68 +1480,188 @@ static void pick_best_mode(win_window_info *window)
// update_window_size
//============================================================
-static int update_window_size(win_window_info *window)
+int renderer::update_window_size()
{
- d3d_info *d3d = (d3d_info *)window->drawdata;
- RECT client;
-
// get the current window bounds
- GetClientRectExceptMenu(window->hwnd, &client, window->fullscreen);
+ RECT client;
+ GetClientRectExceptMenu(m_window->hwnd, &client, m_window->fullscreen);
// if we have a device and matching width/height, nothing to do
- if (d3d->device != NULL && rect_width(&client) == d3d->width && rect_height(&client) == d3d->height)
+ if (m_device != NULL && rect_width(&client) == m_width && rect_height(&client) == m_height)
{
// clear out any pending resizing if the area didn't change
- if (window->resize_state == RESIZE_STATE_PENDING)
- window->resize_state = RESIZE_STATE_NORMAL;
+ if (m_window->resize_state == RESIZE_STATE_PENDING)
+ m_window->resize_state = RESIZE_STATE_NORMAL;
return FALSE;
}
// if we're in the middle of resizing, leave it alone as well
- if (window->resize_state == RESIZE_STATE_RESIZING)
+ if (m_window->resize_state == RESIZE_STATE_RESIZING)
return FALSE;
// set the new bounds and create the device again
- d3d->width = rect_width(&client);
- d3d->height = rect_height(&client);
- if (device_create(window))
+ m_width = rect_width(&client);
+ m_height = rect_height(&client);
+ if (device_create())
return FALSE;
// reset the resize state to normal, and indicate we made a change
- window->resize_state = RESIZE_STATE_NORMAL;
+ m_window->resize_state = RESIZE_STATE_NORMAL;
return TRUE;
}
+//============================================================
+// batch_vectors
+//============================================================
+
+void renderer::batch_vectors()
+{
+ windows_options &options = downcast<windows_options &>(m_window->machine().options());
+
+ int vector_size = (options.antialias() ? 24 : 6);
+ m_vectorbatch = mesh_alloc(m_line_count * vector_size);
+ m_batchindex = 0;
+
+ static int start_index = 0;
+ int line_index = 0;
+ float period = options.screen_vector_time_period();
+ UINT32 cached_flags = 0;
+ for (render_primitive *prim = m_window->primlist->first(); prim != NULL; prim = prim->next())
+ {
+ switch (prim->type)
+ {
+ case render_primitive::LINE:
+ if (PRIMFLAG_GET_VECTOR(prim->flags))
+ {
+ if (period == 0.0f || m_line_count == 0)
+ {
+ batch_vector(prim, 1.0f);
+ }
+ else
+ {
+ batch_vector(prim, (float)(start_index + line_index) / ((float)m_line_count * period));
+ line_index++;
+ }
+ cached_flags = prim->flags;
+ }
+ break;
+
+ default:
+ // Skip
+ break;
+ }
+ }
+
+ // now add a polygon entry
+ m_poly[m_numpolys].init(D3DPT_TRIANGLELIST, m_line_count * (options.antialias() ? 8 : 2), vector_size * m_line_count, cached_flags,
+ m_texture_manager->get_vector_texture(), D3DTOP_MODULATE, 0.0f, 1.0f);
+ m_numpolys++;
+
+ start_index += (int)((float)line_index * period);
+ if (m_line_count > 0)
+ {
+ start_index %= m_line_count;
+ }
+}
+
+void renderer::batch_vector(const render_primitive *prim, float line_time)
+{
+ // compute the effective width based on the direction of the line
+ float effwidth = prim->width;
+ if (effwidth < 0.5f)
+ {
+ effwidth = 0.5f;
+ }
+
+ // determine the bounds of a quad to draw this line
+ render_bounds b0, b1;
+ render_line_to_quad(&prim->bounds, effwidth, &b0, &b1);
+
+ // iterate over AA steps
+ for (const line_aa_step *step = PRIMFLAG_GET_ANTIALIAS(prim->flags) ? line_aa_4step : line_aa_1step;
+ step->weight != 0; step++)
+ {
+ // get a pointer to the vertex buffer
+ if (m_vectorbatch == NULL)
+ return;
+
+ m_vectorbatch[m_batchindex + 0].x = b0.x0 + step->xoffs;
+ m_vectorbatch[m_batchindex + 0].y = b0.y0 + step->yoffs;
+ m_vectorbatch[m_batchindex + 1].x = b0.x1 + step->xoffs;
+ m_vectorbatch[m_batchindex + 1].y = b0.y1 + step->yoffs;
+ m_vectorbatch[m_batchindex + 2].x = b1.x0 + step->xoffs;
+ m_vectorbatch[m_batchindex + 2].y = b1.y0 + step->yoffs;
+
+ m_vectorbatch[m_batchindex + 3].x = b0.x1 + step->xoffs;
+ m_vectorbatch[m_batchindex + 3].y = b0.y1 + step->yoffs;
+ m_vectorbatch[m_batchindex + 4].x = b1.x0 + step->xoffs;
+ m_vectorbatch[m_batchindex + 4].y = b1.y0 + step->yoffs;
+ m_vectorbatch[m_batchindex + 5].x = b1.x1 + step->xoffs;
+ m_vectorbatch[m_batchindex + 5].y = b1.y1 + step->yoffs;
+
+ // determine the color of the line
+ INT32 r = (INT32)(prim->color.r * step->weight * 255.0f);
+ INT32 g = (INT32)(prim->color.g * step->weight * 255.0f);
+ INT32 b = (INT32)(prim->color.b * step->weight * 255.0f);
+ INT32 a = (INT32)(prim->color.a * 255.0f);
+ if (r > 255) r = 255;
+ if (g > 255) g = 255;
+ if (b > 255) b = 255;
+ if (a > 255) a = 255;
+ DWORD color = D3DCOLOR_ARGB(a, r, g, b);
+
+ vec2f& start = (get_vector_texture() ? get_vector_texture()->get_uvstart() : get_default_texture()->get_uvstart());
+ vec2f& stop = (get_vector_texture() ? get_vector_texture()->get_uvstop() : get_default_texture()->get_uvstop());
+
+ m_vectorbatch[m_batchindex + 0].u0 = start.c.x;
+ m_vectorbatch[m_batchindex + 0].v0 = start.c.y;
+ m_vectorbatch[m_batchindex + 1].u0 = start.c.x;
+ m_vectorbatch[m_batchindex + 1].v0 = stop.c.y;
+ m_vectorbatch[m_batchindex + 2].u0 = stop.c.x;
+ m_vectorbatch[m_batchindex + 2].v0 = start.c.y;
+
+ m_vectorbatch[m_batchindex + 3].u0 = start.c.x;
+ m_vectorbatch[m_batchindex + 3].v0 = stop.c.y;
+ m_vectorbatch[m_batchindex + 4].u0 = stop.c.x;
+ m_vectorbatch[m_batchindex + 4].v0 = start.c.y;
+ m_vectorbatch[m_batchindex + 5].u0 = stop.c.x;
+ m_vectorbatch[m_batchindex + 5].v0 = stop.c.y;
+
+ // set the color, Z parameters to standard values
+ for (int i = 0; i < 6; i++)
+ {
+ m_vectorbatch[m_batchindex + i].z = 0.0f;
+ m_vectorbatch[m_batchindex + i].rhw = 1.0f;
+ m_vectorbatch[m_batchindex + i].color = color;
+ }
+ m_batchindex += 6;
+ }
+}
//============================================================
// draw_line
//============================================================
-static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_time)
+void renderer::draw_line(const render_primitive *prim)
{
- const line_aa_step *step = line_aa_4step;
- render_bounds b0, b1;
- d3d_vertex *vertex;
- INT32 r, g, b, a;
- d3d_poly_info *poly;
- float effwidth;
- DWORD color;
- int i;
-
// compute the effective width based on the direction of the line
- effwidth = prim->width;
+ float effwidth = prim->width;
if (effwidth < 0.5f)
+ {
effwidth = 0.5f;
+ }
// determine the bounds of a quad to draw this line
+ render_bounds b0, b1;
render_line_to_quad(&prim->bounds, effwidth, &b0, &b1);
// iterate over AA steps
- for (step = PRIMFLAG_GET_ANTIALIAS(prim->flags) ? line_aa_4step : line_aa_1step; step->weight != 0; step++)
+ for (const line_aa_step *step = PRIMFLAG_GET_ANTIALIAS(prim->flags) ? line_aa_4step : line_aa_1step;
+ step->weight != 0; step++)
{
// get a pointer to the vertex buffer
- vertex = primitive_alloc(d3d, 4);
+ vertex *vertex = mesh_alloc(4);
if (vertex == NULL)
return;
@@ -1524,48 +1682,33 @@ static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_ti
vertex[3].y = b1.y1 + step->yoffs;
// determine the color of the line
- r = (INT32)(prim->color.r * step->weight * 255.0f);
- g = (INT32)(prim->color.g * step->weight * 255.0f);
- b = (INT32)(prim->color.b * step->weight * 255.0f);
- a = (INT32)(prim->color.a * 255.0f);
+ INT32 r = (INT32)(prim->color.r * step->weight * 255.0f);
+ INT32 g = (INT32)(prim->color.g * step->weight * 255.0f);
+ INT32 b = (INT32)(prim->color.b * step->weight * 255.0f);
+ INT32 a = (INT32)(prim->color.a * 255.0f);
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
if (a > 255) a = 255;
- color = D3DCOLOR_ARGB(a, r, g, b);
-
- // if we have a texture to use for the vectors, use it here
- if (d3d->vector_texture != NULL)
- {
- vertex[0].u0 = d3d->vector_texture->ustart;
- vertex[0].v0 = d3d->vector_texture->vstart;
-
- vertex[2].u0 = d3d->vector_texture->ustop;
- vertex[2].v0 = d3d->vector_texture->vstart;
+ DWORD color = D3DCOLOR_ARGB(a, r, g, b);
- vertex[1].u0 = d3d->vector_texture->ustart;
- vertex[1].v0 = d3d->vector_texture->vstop;
+ vec2f& start = (get_vector_texture() ? get_vector_texture()->get_uvstart() : get_default_texture()->get_uvstart());
+ vec2f& stop = (get_vector_texture() ? get_vector_texture()->get_uvstop() : get_default_texture()->get_uvstop());
- vertex[3].u0 = d3d->vector_texture->ustop;
- vertex[3].v0 = d3d->vector_texture->vstop;
- }
- else if(d3d->default_texture != NULL)
- {
- vertex[0].u0 = d3d->default_texture->ustart;
- vertex[0].v0 = d3d->default_texture->vstart;
+ vertex[0].u0 = start.c.x;
+ vertex[0].v0 = start.c.y;
- vertex[2].u0 = d3d->default_texture->ustart;
- vertex[2].v0 = d3d->default_texture->vstart;
+ vertex[2].u0 = stop.c.x;
+ vertex[2].v0 = start.c.y;
- vertex[1].u0 = d3d->default_texture->ustart;
- vertex[1].v0 = d3d->default_texture->vstart;
+ vertex[1].u0 = start.c.x;
+ vertex[1].v0 = stop.c.y;
- vertex[3].u0 = d3d->default_texture->ustart;
- vertex[3].v0 = d3d->default_texture->vstart;
- }
+ vertex[3].u0 = stop.c.x;
+ vertex[3].v0 = stop.c.y;
// set the color, Z parameters to standard values
- for (i = 0; i < 4; i++)
+ for (int i = 0; i < 4; i++)
{
vertex[i].z = 0.0f;
vertex[i].rhw = 1.0f;
@@ -1573,29 +1716,9 @@ static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_ti
}
// now add a polygon entry
- poly = &d3d->poly[d3d->numpolys++];
- poly->type = D3DPT_TRIANGLESTRIP;
- poly->count = 2;
- poly->numverts = 4;
- poly->flags = prim->flags;
- poly->modmode = D3DTOP_MODULATE;
- poly->texture = d3d->vector_texture;
- poly->line_time = line_time;
- poly->line_length = 1.0f;
- if (PRIMFLAG_GET_VECTOR(poly->flags))
- {
- float dx = fabs(prim->bounds.x1 - prim->bounds.x0);
- float dy = fabs(prim->bounds.y1 - prim->bounds.y0);
- float length2 = dx * dx + dy * dy;
- if (length2 > 0.0f)
- {
- poly->line_length = sqrt(length2);
- }
- else
- {
- // use default length of 1.0f from above
- }
- }
+ m_poly[m_numpolys].init(D3DPT_TRIANGLESTRIP, 2, 4, prim->flags, get_vector_texture(),
+ D3DTOP_MODULATE, 0.0f, 1.0f);
+ m_numpolys++;
}
}
@@ -1605,19 +1728,17 @@ static void draw_line(d3d_info *d3d, const render_primitive *prim, float line_ti
// draw_quad
//============================================================
-static void draw_quad(d3d_info *d3d, const render_primitive *prim)
+void renderer::draw_quad(const render_primitive *prim)
{
- d3d_texture_info *texture = texture_find(d3d, prim);
- DWORD color, modmode;
- d3d_vertex *vertex;
- INT32 r, g, b, a;
- d3d_poly_info *poly;
- int i;
+ texture_info *texture = m_texture_manager->find_texinfo(&prim->texture, prim->flags);
- texture = texture != NULL ? texture : d3d->default_texture;
+ if (texture == NULL)
+ {
+ texture = get_default_texture();
+ }
// get a pointer to the vertex buffer
- vertex = primitive_alloc(d3d, 4);
+ vertex *vertex = mesh_alloc(4);
if (vertex == NULL)
return;
@@ -1634,29 +1755,30 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim)
// set the texture coordinates
if(texture != NULL)
{
- float du = texture->ustop - texture->ustart;
- float dv = texture->vstop - texture->vstart;
- vertex[0].u0 = texture->ustart + du * prim->texcoords.tl.u;
- vertex[0].v0 = texture->vstart + dv * prim->texcoords.tl.v;
- vertex[1].u0 = texture->ustart + du * prim->texcoords.tr.u;
- vertex[1].v0 = texture->vstart + dv * prim->texcoords.tr.v;
- vertex[2].u0 = texture->ustart + du * prim->texcoords.bl.u;
- vertex[2].v0 = texture->vstart + dv * prim->texcoords.bl.v;
- vertex[3].u0 = texture->ustart + du * prim->texcoords.br.u;
- vertex[3].v0 = texture->vstart + dv * prim->texcoords.br.v;
+ vec2f& start = texture->get_uvstart();
+ vec2f& stop = texture->get_uvstop();
+ vec2f delta = stop - start;
+ vertex[0].u0 = start.c.x + delta.c.x * prim->texcoords.tl.u;
+ vertex[0].v0 = start.c.y + delta.c.y * prim->texcoords.tl.v;
+ vertex[1].u0 = start.c.x + delta.c.x * prim->texcoords.tr.u;
+ vertex[1].v0 = start.c.y + delta.c.y * prim->texcoords.tr.v;
+ vertex[2].u0 = start.c.x + delta.c.x * prim->texcoords.bl.u;
+ vertex[2].v0 = start.c.y + delta.c.y * prim->texcoords.bl.v;
+ vertex[3].u0 = start.c.x + delta.c.x * prim->texcoords.br.u;
+ vertex[3].v0 = start.c.y + delta.c.y * prim->texcoords.br.v;
}
// determine the color, allowing for over modulation
- r = (INT32)(prim->color.r * 255.0f);
- g = (INT32)(prim->color.g * 255.0f);
- b = (INT32)(prim->color.b * 255.0f);
- a = (INT32)(prim->color.a * 255.0f);
- modmode = D3DTOP_MODULATE;
+ INT32 r = (INT32)(prim->color.r * 255.0f);
+ INT32 g = (INT32)(prim->color.g * 255.0f);
+ INT32 b = (INT32)(prim->color.b * 255.0f);
+ INT32 a = (INT32)(prim->color.a * 255.0f);
+ DWORD modmode = D3DTOP_MODULATE;
if (texture != NULL)
{
- if (d3d->mod2x_supported && (r > 255 || g > 255 || b > 255))
+ if (m_mod2x_supported && (r > 255 || g > 255 || b > 255))
{
- if (d3d->mod4x_supported && (r > 2*255 || g > 2*255 || b > 2*255))
+ if (m_mod4x_supported && (r > 2*255 || g > 2*255 || b > 2*255))
{
r >>= 2; g >>= 2; b >>= 2;
modmode = D3DTOP_MODULATE4X;
@@ -1672,10 +1794,10 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim)
if (g > 255) g = 255;
if (b > 255) b = 255;
if (a > 255) a = 255;
- color = D3DCOLOR_ARGB(a, r, g, b);
+ DWORD color = D3DCOLOR_ARGB(a, r, g, b);
// set the color, Z parameters to standard values
- for (i = 0; i < 4; i++)
+ for (int i = 0; i < 4; i++)
{
vertex[i].z = 0.0f;
vertex[i].rhw = 1.0f;
@@ -1683,51 +1805,64 @@ static void draw_quad(d3d_info *d3d, const render_primitive *prim)
}
// now add a polygon entry
- poly = &d3d->poly[d3d->numpolys++];
- poly->type = D3DPT_TRIANGLESTRIP;
- poly->count = 2;
- poly->numverts = 4;
- poly->flags = prim->flags;
- poly->modmode = modmode;
- poly->texture = texture;
- //poly->
+ m_poly[m_numpolys].init(D3DPT_TRIANGLESTRIP, 2, 4, prim->flags, texture, modmode);
+ m_numpolys++;
+}
+
+void poly_info::init(D3DPRIMITIVETYPE type, UINT32 count, UINT32 numverts,
+ UINT32 flags, texture_info *texture, UINT32 modmode,
+ float line_time, float line_length)
+{
+ init(type, count, numverts, flags, texture, modmode);
+ m_line_time = line_time;
+ m_line_length = line_length;
}
+void poly_info::init(D3DPRIMITIVETYPE type, UINT32 count, UINT32 numverts,
+ UINT32 flags, texture_info *texture, UINT32 modmode)
+{
+ m_type = type;
+ m_count = count;
+ m_numverts = numverts;
+ m_flags = flags;
+ m_texture = texture;
+ m_modmode = modmode;
+}
//============================================================
// primitive_alloc
//============================================================
-static d3d_vertex *primitive_alloc(d3d_info *d3d, int numverts)
+vertex *renderer::mesh_alloc(int numverts)
{
HRESULT result;
// if we're going to overflow, flush
- if (d3d->lockedbuf != NULL && d3d->numverts + numverts >= VERTEX_BUFFER_SIZE)
+ if (m_lockedbuf != NULL && m_numverts + numverts >= VERTEX_BUFFER_SIZE)
{
- primitive_flush_pending(d3d);
+ primitive_flush_pending();
- if(d3d->hlsl->enabled())
+ if(m_shaders->enabled())
{
- d3d->hlsl_buf = (void*)primitive_alloc(d3d, 6);
- d3d->hlsl->init_fsfx_quad(d3d->hlsl_buf);
+ m_hlsl_buf = (void*)mesh_alloc(6);
+ m_shaders->init_fsfx_quad(m_hlsl_buf);
}
}
// if we don't have a lock, grab it now
- if (d3d->lockedbuf == NULL)
+ if (m_lockedbuf == NULL)
{
- result = (*d3dintf->vertexbuf.lock)(d3d->vertexbuf, 0, 0, (VOID **)&d3d->lockedbuf, D3DLOCK_DISCARD);
+ result = (*d3dintf->vertexbuf.lock)(m_vertexbuf, 0, 0, (VOID **)&m_lockedbuf, D3DLOCK_DISCARD);
if (result != D3D_OK)
return NULL;
}
// if we already have the lock and enough room, just return a pointer
- if (d3d->lockedbuf != NULL && d3d->numverts + numverts < VERTEX_BUFFER_SIZE)
+ if (m_lockedbuf != NULL && m_numverts + numverts < VERTEX_BUFFER_SIZE)
{
- int oldverts = d3d->numverts;
- d3d->numverts += numverts;
- return &d3d->lockedbuf[oldverts];
+ int oldverts = m_numverts;
+ m_numverts += numverts;
+ return &m_lockedbuf[oldverts];
}
return NULL;
}
@@ -1738,170 +1873,206 @@ static d3d_vertex *primitive_alloc(d3d_info *d3d, int numverts)
// primitive_flush_pending
//============================================================
-static void primitive_flush_pending(d3d_info *d3d)
+void renderer::primitive_flush_pending()
{
- HRESULT result;
- int polynum;
- int vertnum;
-
// ignore if we're not locked
- if (d3d->lockedbuf == NULL)
+ if (m_lockedbuf == NULL)
+ {
return;
+ }
// unlock the buffer
- result = (*d3dintf->vertexbuf.unlock)(d3d->vertexbuf);
+ HRESULT result = (*d3dintf->vertexbuf.unlock)(m_vertexbuf);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during vertex buffer unlock call\n", (int)result);
- d3d->lockedbuf = NULL;
+ m_lockedbuf = NULL;
// set the stream
- result = (*d3dintf->device.set_stream_source)(d3d->device, 0, d3d->vertexbuf, sizeof(d3d_vertex));
+ result = (*d3dintf->device.set_stream_source)(m_device, 0, m_vertexbuf, sizeof(vertex));
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_stream_source call\n", (int)result);
- d3d->hlsl->begin_draw();
+ m_shaders->begin_draw();
- if (d3d->hlsl->enabled())
+ int vertnum = 0;
+ if (m_shaders->enabled())
{
vertnum = 6;
}
- else
- {
- vertnum = 0;
- }
// now do the polys
- for (polynum = 0; polynum < d3d->numpolys; polynum++)
+ for (int polynum = 0; polynum < m_numpolys; polynum++)
{
- d3d_poly_info *poly = &d3d->poly[polynum];
+ UINT32 flags = m_poly[polynum].get_flags();
+ texture_info *texture = m_poly[polynum].get_texture();
int newfilter;
// set the texture if different
- set_texture(d3d, poly->texture);
+ set_texture(texture);
// set filtering if different
- if (poly->texture != NULL)
+ if (texture != NULL)
{
newfilter = FALSE;
- if (PRIMFLAG_GET_SCREENTEX(poly->flags))
+ if (PRIMFLAG_GET_SCREENTEX(flags))
newfilter = video_config.filter;
- set_filter(d3d, newfilter);
- set_wrap(d3d, PRIMFLAG_GET_TEXWRAP(poly->flags));
- set_modmode(d3d, poly->modmode);
+ set_filter(newfilter);
+ set_wrap(PRIMFLAG_GET_TEXWRAP(flags) ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP);
+ set_modmode(m_poly[polynum].get_modmode());
- d3d->hlsl->init_effect_info(poly);
+ m_shaders->init_effect_info(&m_poly[polynum]);
}
// set the blendmode if different
- set_blendmode(d3d, PRIMFLAG_GET_BLENDMODE(poly->flags));
+ set_blendmode(PRIMFLAG_GET_BLENDMODE(flags));
- if(d3d->hlsl->enabled() && d3dintf->post_fx_available)
- {
- assert(vertnum + poly->numverts <= d3d->numverts);
+ assert(vertnum + m_poly[polynum].get_vertcount() <= m_numverts);
- d3d->hlsl->render_quad(poly, vertnum);
+ if(m_shaders->enabled() && d3dintf->post_fx_available)
+ {
+ m_shaders->render_quad(&m_poly[polynum], vertnum);
}
else
{
- assert(vertnum + poly->numverts <= d3d->numverts);
-
// add the primitives
- result = (*d3dintf->device.draw_primitive)(d3d->device, poly->type, vertnum, poly->count);
+ result = (*d3dintf->device.draw_primitive)(m_device, m_poly[polynum].get_type(), vertnum,
+ m_poly[polynum].get_count());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
}
- vertnum += poly->numverts;
+ vertnum += m_poly[polynum].get_vertcount();
}
- d3d->hlsl->end_draw();
+ m_shaders->end_draw();
// reset the vertex count
- d3d->numverts = 0;
- d3d->numpolys = 0;
+ m_numverts = 0;
+ m_numpolys = 0;
}
+//============================================================
+// texture_info destructor
+//============================================================
-void texture_destroy(d3d_info *d3d, d3d_texture_info *info)
+texture_info::~texture_info()
{
+ if (m_d3dfinaltex != NULL)
+ {
+ if (m_d3dtex == m_d3dfinaltex)
+ {
+ m_d3dtex = NULL;
+ }
+ (*d3dintf->texture.release)(m_d3dfinaltex);
+ m_d3dfinaltex = NULL;
+ }
+ if (m_d3dtex != NULL)
+ {
+ (*d3dintf->texture.release)(m_d3dtex);
+ m_d3dtex = NULL;
+ }
+ if (m_d3dsurface != NULL)
+ {
+ (*d3dintf->surface.release)(m_d3dsurface);
+ m_d3dsurface = NULL;
+ }
}
//============================================================
-// texture_create
+// texture_info constructor
//============================================================
-d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags)
+texture_info::texture_info(texture_manager *manager, const render_texinfo* texsource, UINT32 flags)
{
- d3d_texture_info *texture;
HRESULT result;
- // allocate a new texture
- texture = global_alloc_clear(d3d_texture_info);
-
// fill in the core data
- texture->hash = texture_compute_hash(texsource, flags);
- texture->flags = flags;
- texture->texinfo = *texsource;
- texture->xprescale = video_config.prescale;
- texture->yprescale = video_config.prescale;
+ m_texture_manager = manager;
+ m_renderer = m_texture_manager->get_d3d();
+ m_hash = m_texture_manager->texture_compute_hash(texsource, flags);
+ m_flags = flags;
+ m_texinfo = *texsource;
+ m_xprescale = video_config.prescale;
+ m_yprescale = video_config.prescale;
+
+ m_d3dtex = NULL;
+ m_d3dsurface = NULL;
+ m_d3dfinaltex = NULL;
// compute the size
- texture_compute_size(d3d, texsource->width, texsource->height, texture);
+ compute_size(texsource->width, texsource->height);
// non-screen textures are easy
if (!PRIMFLAG_GET_SCREENTEX(flags))
{
assert(PRIMFLAG_TEXFORMAT(flags) != TEXFORMAT_YUY16);
- result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &texture->d3dtex);
+ result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_d3dtex);
if (result != D3D_OK)
goto error;
- texture->d3dfinaltex = texture->d3dtex;
- texture->type = TEXTURE_TYPE_PLAIN;
+ m_d3dfinaltex = m_d3dtex;
+ m_type = TEXTURE_TYPE_PLAIN;
}
// screen textures are allocated differently
else
{
D3DFORMAT format;
- DWORD usage = d3d->dynamic_supported ? D3DUSAGE_DYNAMIC : 0;
- D3DPOOL pool = d3d->dynamic_supported ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED;
- int maxdim = MAX(d3d->presentation.BackBufferWidth, d3d->presentation.BackBufferHeight);
- int attempt;
+ DWORD usage = m_texture_manager->is_dynamic_supported() ? D3DUSAGE_DYNAMIC : 0;
+ D3DPOOL pool = m_texture_manager->is_dynamic_supported() ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED;
+ int maxdim = MAX(m_renderer->get_presentation()->BackBufferWidth, m_renderer->get_presentation()->BackBufferHeight);
// pick the format
if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_YUY16)
- format = d3d->yuv_format;
+ {
+ format = m_texture_manager->get_yuv_format();
+ }
else if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_ARGB32 || PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_PALETTEA16)
+ {
format = D3DFMT_A8R8G8B8;
+ }
else
- format = d3d->screen_format;
+ {
+ format = m_renderer->get_screen_format();
+ }
// don't prescale above screen size
- while (texture->xprescale > 1 && texture->rawwidth * texture->xprescale >= 2 * maxdim)
- texture->xprescale--;
- while (texture->xprescale > 1 && texture->rawwidth * texture->xprescale > d3d->texture_max_width)
- texture->xprescale--;
- while (texture->yprescale > 1 && texture->rawheight * texture->yprescale >= 2 * maxdim)
- texture->yprescale--;
- while (texture->yprescale > 1 && texture->rawheight * texture->yprescale > d3d->texture_max_height)
- texture->yprescale--;
- if (texture->xprescale != video_config.prescale || texture->yprescale != video_config.prescale)
- mame_printf_verbose("Direct3D: adjusting prescale from %dx%d to %dx%d\n", video_config.prescale, video_config.prescale, texture->xprescale, texture->yprescale);
+ while (m_xprescale > 1 && m_rawdims.c.x * m_xprescale >= 2 * maxdim)
+ {
+ m_xprescale--;
+ }
+ while (m_xprescale > 1 && m_rawdims.c.x * m_xprescale > manager->get_max_texture_width())
+ {
+ m_xprescale--;
+ }
+ while (m_yprescale > 1 && m_rawdims.c.y * m_yprescale >= 2 * maxdim)
+ {
+ m_yprescale--;
+ }
+ while (m_yprescale > 1 && m_rawdims.c.y * m_yprescale > manager->get_max_texture_height())
+ {
+ m_yprescale--;
+ }
+ if (m_xprescale != video_config.prescale || m_yprescale != video_config.prescale)
+ {
+ mame_printf_verbose("Direct3D: adjusting prescale from %dx%d to %dx%d\n", video_config.prescale, video_config.prescale, m_xprescale, m_yprescale);
+ }
// loop until we allocate something or error
- for (attempt = 0; attempt < 2; attempt++)
+ for (int attempt = 0; attempt < 2; attempt++)
{
// second attempt is always 1:1
if (attempt == 1)
- texture->xprescale = texture->yprescale = 1;
+ {
+ m_xprescale = m_yprescale = 1;
+ }
// screen textures with no prescaling are pretty easy
- if (texture->xprescale == 1 && texture->yprescale == 1)
+ if (m_xprescale == 1 && m_yprescale == 1)
{
- result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, usage, format, pool, &texture->d3dtex);
+ result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex);
if (result == D3D_OK)
{
- texture->d3dfinaltex = texture->d3dtex;
- texture->type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN;
+ m_d3dfinaltex = m_d3dtex;
+ m_type = m_texture_manager->is_dynamic_supported() ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN;
- if (d3d->hlsl->enabled() && !d3d->hlsl->register_texture(texture))
+ if (m_renderer->get_shaders()->enabled() && !m_renderer->get_shaders()->register_texture(this))
{
goto error;
}
@@ -1913,98 +2084,98 @@ d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource,
// screen textures with prescaling require two allocations
else
{
- int scwidth, scheight;
- D3DFORMAT finalfmt;
-
// use an offscreen plain surface for stretching if supported
// (won't work for YUY textures)
- if (d3d->stretch_supported && PRIMFLAG_GET_TEXFORMAT(flags) != TEXFORMAT_YUY16)
+ if (m_texture_manager->is_stretch_supported() && PRIMFLAG_GET_TEXFORMAT(flags) != TEXFORMAT_YUY16)
{
- result = (*d3dintf->device.create_offscreen_plain_surface)(d3d->device, texture->rawwidth, texture->rawheight, format, D3DPOOL_DEFAULT, &texture->d3dsurface);
+ result = (*d3dintf->device.create_offscreen_plain_surface)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, format, D3DPOOL_DEFAULT, &m_d3dsurface);
if (result != D3D_OK)
+ {
continue;
- texture->type = TEXTURE_TYPE_SURFACE;
+ }
+ m_type = TEXTURE_TYPE_SURFACE;
}
// otherwise, we allocate a dynamic texture for the source
else
{
- result = (*d3dintf->device.create_texture)(d3d->device, texture->rawwidth, texture->rawheight, 1, usage, format, pool, &texture->d3dtex);
+ result = (*d3dintf->device.create_texture)(m_renderer->get_device(), m_rawdims.c.x, m_rawdims.c.y, 1, usage, format, pool, &m_d3dtex);
if (result != D3D_OK)
+ {
continue;
- texture->type = d3d->dynamic_supported ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN;
+ }
+ m_type = m_texture_manager->is_dynamic_supported() ? TEXTURE_TYPE_DYNAMIC : TEXTURE_TYPE_PLAIN;
}
// for the target surface, we allocate a render target texture
- scwidth = texture->rawwidth * texture->xprescale;
- scheight = texture->rawheight * texture->yprescale;
+ int scwidth = m_rawdims.c.x * m_xprescale;
+ int scheight = m_rawdims.c.y * m_yprescale;
// target surfaces typically cannot be YCbCr, so we always pick RGB in that case
- finalfmt = (format != d3d->yuv_format) ? format : D3DFMT_A8R8G8B8;
- result = (*d3dintf->device.create_texture)(d3d->device, scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &texture->d3dfinaltex);
+ D3DFORMAT finalfmt = (format != m_texture_manager->get_yuv_format()) ? format : D3DFMT_A8R8G8B8;
+ result = (*d3dintf->device.create_texture)(m_renderer->get_device(), scwidth, scheight, 1, D3DUSAGE_RENDERTARGET, finalfmt, D3DPOOL_DEFAULT, &m_d3dfinaltex);
if (result == D3D_OK)
{
- if (d3d->hlsl->enabled() && !d3d->hlsl->register_prescaled_texture(texture))
+ if (m_renderer->get_shaders()->enabled() && !m_renderer->get_shaders()->register_prescaled_texture(this))
{
goto error;
}
break;
}
- (*d3dintf->texture.release)(texture->d3dtex);
- texture->d3dtex = NULL;
+ (*d3dintf->texture.release)(m_d3dtex);
+ m_d3dtex = NULL;
}
}
}
// copy the data to the texture
- texture_set_data(d3d, texture, texsource, flags);
+ set_data(texsource, flags);
+ //texsource->osdhandle = (void*)this;
// add us to the texture list
- if(d3d->texlist != NULL)
- d3d->texlist->prev = texture;
- texture->prev = NULL;
- texture->next = d3d->texlist;
- d3d->texlist = texture;
- return texture;
+ if(m_texture_manager->get_texlist() != NULL)
+ m_texture_manager->get_texlist()->m_prev = this;
+ m_prev = NULL;
+ m_next = m_texture_manager->get_texlist();
+ m_texture_manager->set_texlist(this);
+ return;
error:
d3dintf->post_fx_available = false;
printf("Direct3D: Critical warning: A texture failed to allocate. Expect things to get bad quickly.\n");
- if (texture->d3dsurface != NULL)
- (*d3dintf->surface.release)(texture->d3dsurface);
- if (texture->d3dtex != NULL)
- (*d3dintf->texture.release)(texture->d3dtex);
- global_free(texture);
- return NULL;
+ if (m_d3dsurface != NULL)
+ (*d3dintf->surface.release)(m_d3dsurface);
+ if (m_d3dtex != NULL)
+ (*d3dintf->texture.release)(m_d3dtex);
}
//============================================================
-// texture_compute_size
+// texture_info::compute_size
//============================================================
-static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d_texture_info *texture)
+void texture_info::compute_size(int texwidth, int texheight)
{
int finalheight = texheight;
int finalwidth = texwidth;
// if we're not wrapping, add a 1-2 pixel border on all sides
- texture->xborderpix = 0;
- texture->yborderpix = 0;
- if (ENABLE_BORDER_PIX && !(texture->flags & PRIMFLAG_TEXWRAP_MASK))
+ 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
- texture->xborderpix = (PRIMFLAG_GET_TEXFORMAT(texture->flags) == TEXFORMAT_YUY16) ? 2 : 1;
- texture->yborderpix = 1;
+ m_xborderpix = (PRIMFLAG_GET_TEXFORMAT(m_flags) == TEXFORMAT_YUY16) ? 2 : 1;
+ m_yborderpix = 1;
}
// compute final texture size
- finalwidth += 2 * texture->xborderpix;
- finalheight += 2 * texture->yborderpix;
+ finalwidth += 2 * m_xborderpix;
+ finalheight += 2 * m_yborderpix;
// round width/height up to nearest power of 2 if we need to
- if (!(d3d->texture_caps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL))
+ if (!(m_texture_manager->get_texture_caps() & D3DPTEXTURECAPS_NONPOW2CONDITIONAL))
{
// first the width
if (finalwidth & (finalwidth - 1))
@@ -2028,7 +2199,7 @@ static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d
}
// round up to square if we need to
- if (d3d->texture_caps & D3DPTEXTURECAPS_SQUAREONLY)
+ if (m_texture_manager->get_texture_caps() & D3DPTEXTURECAPS_SQUAREONLY)
{
if (finalwidth < finalheight)
finalwidth = finalheight;
@@ -2037,38 +2208,42 @@ static void texture_compute_size(d3d_info *d3d, int texwidth, int texheight, d3d
}
// adjust the aspect ratio if we need to
- while (finalwidth < finalheight && finalheight / finalwidth > d3d->texture_max_aspect)
+ while (finalwidth < finalheight && finalheight / finalwidth > m_texture_manager->get_max_texture_aspect())
+ {
finalwidth *= 2;
- while (finalheight < finalwidth && finalwidth / finalheight > d3d->texture_max_aspect)
+ }
+ while (finalheight < finalwidth && finalwidth / finalheight > m_texture_manager->get_max_texture_aspect())
+ {
finalheight *= 2;
+ }
// if we added pixels for the border, and that just barely pushed us over, take it back
- if ((finalwidth > d3d->texture_max_width && finalwidth - 2 * texture->xborderpix <= d3d->texture_max_width) ||
- (finalheight > d3d->texture_max_height && finalheight - 2 * texture->yborderpix <= d3d->texture_max_height))
+ 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()))
{
- finalwidth -= 2 * texture->xborderpix;
- finalheight -= 2 * texture->yborderpix;
- texture->xborderpix = 0;
- texture->yborderpix = 0;
+ finalwidth -= 2 * m_xborderpix;
+ finalheight -= 2 * m_yborderpix;
+ m_xborderpix = 0;
+ m_yborderpix = 0;
}
// if we're above the max width/height, do what?
- if (finalwidth > d3d->texture_max_width || finalheight > d3d->texture_max_height)
+ if (finalwidth > m_texture_manager->get_max_texture_width() || finalheight > m_texture_manager->get_max_texture_height())
{
static int printed = FALSE;
- if (!printed) mame_printf_warning("Texture too big! (wanted: %dx%d, max is %dx%d)\n", finalwidth, finalheight, (int)d3d->texture_max_width, (int)d3d->texture_max_height);
+ if (!printed) mame_printf_warning("Texture too big! (wanted: %dx%d, max is %dx%d)\n", finalwidth, finalheight, (int)m_texture_manager->get_max_texture_width(), (int)m_texture_manager->get_max_texture_height());
printed = TRUE;
}
// compute the U/V scale factors
- texture->ustart = (float)texture->xborderpix / (float)finalwidth;
- texture->ustop = (float)(texwidth + texture->xborderpix) / (float)finalwidth;
- texture->vstart = (float)texture->yborderpix / (float)finalheight;
- texture->vstop = (float)(texheight + texture->yborderpix) / (float)finalheight;
+ m_start.c.x = (float)m_xborderpix / (float)finalwidth;
+ m_start.c.y = (float)m_yborderpix / (float)finalheight;
+ m_stop.c.x = (float)(texwidth + m_xborderpix) / (float)finalwidth;
+ m_stop.c.y = (float)(texheight + m_yborderpix) / (float)finalheight;
// set the final values
- texture->rawwidth = finalwidth;
- texture->rawheight = finalheight;
+ m_rawdims.c.x = finalwidth;
+ m_rawdims.c.y = finalheight;
}
@@ -2411,58 +2586,58 @@ INLINE void copyline_yuy16_to_argb(UINT32 *dst, const UINT16 *src, int width, co
// texture_set_data
//============================================================
-static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const render_texinfo *texsource, UINT32 flags)
+void texture_info::set_data(const render_texinfo *texsource, UINT32 flags)
{
D3DLOCKED_RECT rect;
HRESULT result;
- int miny, maxy;
- int dsty;
// lock the texture
- switch (texture->type)
+ switch (m_type)
{
default:
- case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.lock_rect)(texture->d3dtex, 0, &rect, NULL, 0); break;
- case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.lock_rect)(texture->d3dtex, 0, &rect, NULL, D3DLOCK_DISCARD); break;
- case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.lock_rect)(texture->d3dsurface, &rect, NULL, D3DLOCK_DISCARD); break;
+ case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, NULL, 0); break;
+ case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.lock_rect)(m_d3dtex, 0, &rect, NULL, D3DLOCK_DISCARD); break;
+ case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.lock_rect)(m_d3dsurface, &rect, NULL, D3DLOCK_DISCARD); break;
}
if (result != D3D_OK)
+ {
return;
+ }
// loop over Y
- miny = 0 - texture->yborderpix;
- maxy = texsource->height + texture->yborderpix;
- for (dsty = miny; dsty < maxy; dsty++)
+ int miny = 0 - m_yborderpix;
+ int maxy = texsource->height + m_yborderpix;
+ for (int dsty = miny; dsty < maxy; dsty++)
{
int srcy = (dsty < 0) ? 0 : (dsty >= texsource->height) ? texsource->height - 1 : dsty;
- void *dst = (BYTE *)rect.pBits + (dsty + texture->yborderpix) * rect.Pitch;
+ void *dst = (BYTE *)rect.pBits + (dsty + m_yborderpix) * rect.Pitch;
// switch off of the format and
switch (PRIMFLAG_GET_TEXFORMAT(flags))
{
case TEXFORMAT_PALETTE16:
- copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
break;
case TEXFORMAT_PALETTEA16:
- copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
break;
case TEXFORMAT_RGB32:
- copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
break;
case TEXFORMAT_ARGB32:
- copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
break;
case TEXFORMAT_YUY16:
- if (d3d->yuv_format == D3DFMT_YUY2)
- copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
- else if (d3d->yuv_format == D3DFMT_UYVY)
- copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ if (m_texture_manager->get_yuv_format() == D3DFMT_YUY2)
+ copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
+ else if (m_texture_manager->get_yuv_format() == D3DFMT_UYVY)
+ copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
else
- copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, texture->xborderpix);
+ copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
break;
default:
@@ -2472,251 +2647,153 @@ static void texture_set_data(d3d_info *d3d, d3d_texture_info *texture, const ren
}
// unlock
- switch (texture->type)
+ switch (m_type)
{
default:
- case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.unlock_rect)(texture->d3dtex, 0); break;
- case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.unlock_rect)(texture->d3dtex, 0); break;
- case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.unlock_rect)(texture->d3dsurface); break;
+ case TEXTURE_TYPE_PLAIN: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break;
+ case TEXTURE_TYPE_DYNAMIC: result = (*d3dintf->texture.unlock_rect)(m_d3dtex, 0); break;
+ case TEXTURE_TYPE_SURFACE: result = (*d3dintf->surface.unlock_rect)(m_d3dsurface); break;
+ }
+ if (result != D3D_OK)
+ {
+ mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result);
}
- if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture unlock_rect call\n", (int)result);
// prescale
- texture_prescale(d3d, texture);
+ prescale();
}
//============================================================
-// texture_prescale
+// texture_info::prescale
//============================================================
-static void texture_prescale(d3d_info *d3d, d3d_texture_info *texture)
+void texture_info::prescale()
{
- d3d_surface *surface;
+ surface *scale_surface;
HRESULT result;
int i;
// if we don't need to, just skip it
- if (texture->d3dtex == texture->d3dfinaltex)
+ if (m_d3dtex == m_d3dfinaltex)
return;
// for all cases, we need to get the surface of the render target
- result = (*d3dintf->texture.get_surface_level)(texture->d3dfinaltex, 0, &surface);
+ result = (*d3dintf->texture.get_surface_level)(m_d3dfinaltex, 0, &scale_surface);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during texture get_surface_level call\n", (int)result);
// if we have an offscreen plain surface, we can just StretchRect to it
- if (texture->type == TEXTURE_TYPE_SURFACE)
+ if (m_type == TEXTURE_TYPE_SURFACE)
{
- RECT source, dest;
-
- assert(texture->d3dsurface != NULL);
+ assert(m_d3dsurface != NULL);
// set the source bounds
+ RECT source;
source.left = source.top = 0;
- source.right = texture->texinfo.width + 2 * texture->xborderpix;
- source.bottom = texture->texinfo.height + 2 * texture->yborderpix;
+ source.right = m_texinfo.width + 2 * m_xborderpix;
+ source.bottom = m_texinfo.height + 2 * m_yborderpix;
// set the target bounds
+ RECT dest;
dest = source;
- dest.right *= texture->xprescale;
- dest.bottom *= texture->yprescale;
+ dest.right *= m_xprescale;
+ dest.bottom *= m_yprescale;
// do the stretchrect
- result = (*d3dintf->device.stretch_rect)(d3d->device, texture->d3dsurface, &source, surface, &dest, D3DTEXF_POINT);
+ result = (*d3dintf->device.stretch_rect)(m_renderer->get_device(), m_d3dsurface, &source, scale_surface, &dest, D3DTEXF_POINT);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device stretct_rect call\n", (int)result);
}
// if we are using a texture render target, we need to do more preparations
else
{
- d3d_surface *backbuffer;
+ surface *backbuffer;
- assert(texture->d3dtex != NULL);
+ assert(m_d3dtex != NULL);
// first remember the original render target and set the new one
- result = (*d3dintf->device.get_render_target)(d3d->device, 0, &backbuffer);
+ result = (*d3dintf->device.get_render_target)(m_renderer->get_device(), 0, &backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device get_render_target call\n", (int)result);
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, surface);
+ result = (*d3dintf->device.set_render_target)(m_renderer->get_device(), 0, scale_surface);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 1\n", (int)result);
- reset_render_states(d3d);
+ m_renderer->reset_render_states();
// start the scene
- result = (*d3dintf->device.begin_scene)(d3d->device);
+ result = (*d3dintf->device.begin_scene)(m_renderer->get_device());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device begin_scene call\n", (int)result);
// configure the rendering pipeline
- set_filter(d3d, FALSE);
- set_blendmode(d3d, BLENDMODE_NONE);
- result = (*d3dintf->device.set_texture)(d3d->device, 0, texture->d3dtex);
+ m_renderer->set_filter(FALSE);
+ m_renderer->set_blendmode(BLENDMODE_NONE);
+ result = (*d3dintf->device.set_texture)(m_renderer->get_device(), 0, m_d3dtex);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_texture call\n", (int)result);
// lock the vertex buffer
- result = (*d3dintf->vertexbuf.lock)(d3d->vertexbuf, 0, 0, (VOID **)&d3d->lockedbuf, D3DLOCK_DISCARD);
+ result = (*d3dintf->vertexbuf.lock)(m_renderer->get_vertex_buffer(), 0, 0, m_renderer->get_locked_buffer_ptr(), D3DLOCK_DISCARD);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during vertex buffer lock call\n", (int)result);
// configure the X/Y coordinates on the target surface
- d3d->lockedbuf[0].x = -0.5f;
- d3d->lockedbuf[0].y = -0.5f;
- d3d->lockedbuf[1].x = (float)((texture->texinfo.width + 2 * texture->xborderpix) * texture->xprescale) - 0.5f;
- d3d->lockedbuf[1].y = -0.5f;
- d3d->lockedbuf[2].x = -0.5f;
- d3d->lockedbuf[2].y = (float)((texture->texinfo.height + 2 * texture->yborderpix) * texture->yprescale) - 0.5f;
- d3d->lockedbuf[3].x = (float)((texture->texinfo.width + 2 * texture->xborderpix) * texture->xprescale) - 0.5f;
- d3d->lockedbuf[3].y = (float)((texture->texinfo.height + 2 * texture->yborderpix) * texture->yprescale) - 0.5f;
+ vertex *lockedbuf = m_renderer->get_locked_buffer();
+ lockedbuf[0].x = -0.5f;
+ lockedbuf[0].y = -0.5f;
+ lockedbuf[1].x = (float)((m_texinfo.width + 2 * m_xborderpix) * m_xprescale) - 0.5f;
+ lockedbuf[1].y = -0.5f;
+ lockedbuf[2].x = -0.5f;
+ lockedbuf[2].y = (float)((m_texinfo.height + 2 * m_yborderpix) * m_yprescale) - 0.5f;
+ lockedbuf[3].x = (float)((m_texinfo.width + 2 * m_xborderpix) * m_xprescale) - 0.5f;
+ lockedbuf[3].y = (float)((m_texinfo.height + 2 * m_yborderpix) * m_yprescale) - 0.5f;
// configure the U/V coordintes on the source texture
- d3d->lockedbuf[0].u0 = 0.0f;
- d3d->lockedbuf[0].v0 = 0.0f;
- d3d->lockedbuf[1].u0 = (float)(texture->texinfo.width + 2 * texture->xborderpix) / (float)texture->rawwidth;
- d3d->lockedbuf[1].v0 = 0.0f;
- d3d->lockedbuf[2].u0 = 0.0f;
- d3d->lockedbuf[2].v0 = (float)(texture->texinfo.height + 2 * texture->yborderpix) / (float)texture->rawheight;
- d3d->lockedbuf[3].u0 = (float)(texture->texinfo.width + 2 * texture->xborderpix) / (float)texture->rawwidth;
- d3d->lockedbuf[3].v0 = (float)(texture->texinfo.height + 2 * texture->yborderpix) / (float)texture->rawheight;
+ lockedbuf[0].u0 = 0.0f;
+ lockedbuf[0].v0 = 0.0f;
+ lockedbuf[1].u0 = (float)(m_texinfo.width + 2 * m_xborderpix) / (float)m_rawdims.c.x;
+ lockedbuf[1].v0 = 0.0f;
+ lockedbuf[2].u0 = 0.0f;
+ lockedbuf[2].v0 = (float)(m_texinfo.height + 2 * m_yborderpix) / (float)m_rawdims.c.y;
+ lockedbuf[3].u0 = (float)(m_texinfo.width + 2 * m_xborderpix) / (float)m_rawdims.c.x;
+ lockedbuf[3].v0 = (float)(m_texinfo.height + 2 * m_yborderpix) / (float)m_rawdims.c.y;
// reset the remaining vertex parameters
for (i = 0; i < 4; i++)
{
- d3d->lockedbuf[i].z = 0.0f;
- d3d->lockedbuf[i].rhw = 1.0f;
- d3d->lockedbuf[i].color = D3DCOLOR_ARGB(0xff,0xff,0xff,0xff);
+ lockedbuf[i].z = 0.0f;
+ lockedbuf[i].rhw = 1.0f;
+ lockedbuf[i].color = D3DCOLOR_ARGB(0xff,0xff,0xff,0xff);
}
// unlock the vertex buffer
- result = (*d3dintf->vertexbuf.unlock)(d3d->vertexbuf);
+ result = (*d3dintf->vertexbuf.unlock)(m_renderer->get_vertex_buffer());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during vertex buffer unlock call\n", (int)result);
- d3d->lockedbuf = NULL;
+ m_renderer->set_locked_buffer(NULL);
// set the stream and draw the triangle strip
- result = (*d3dintf->device.set_stream_source)(d3d->device, 0, d3d->vertexbuf, sizeof(d3d_vertex));
+ result = (*d3dintf->device.set_stream_source)(m_renderer->get_device(), 0, m_renderer->get_vertex_buffer(), sizeof(vertex));
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_stream_source call\n", (int)result);
- result = (*d3dintf->device.draw_primitive)(d3d->device, D3DPT_TRIANGLESTRIP, 0, 2);
+ result = (*d3dintf->device.draw_primitive)(m_renderer->get_device(), D3DPT_TRIANGLESTRIP, 0, 2);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device draw_primitive call\n", (int)result);
// end the scene
- result = (*d3dintf->device.end_scene)(d3d->device);
+ result = (*d3dintf->device.end_scene)(m_renderer->get_device());
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device end_scene call\n", (int)result);
// reset the render target and release our reference to the backbuffer
- result = (*d3dintf->device.set_render_target)(d3d->device, 0, backbuffer);
+ result = (*d3dintf->device.set_render_target)(m_renderer->get_device(), 0, backbuffer);
if (result != D3D_OK) mame_printf_verbose("Direct3D: Error %08X during device set_render_target call 2\n", (int)result);
(*d3dintf->surface.release)(backbuffer);
- reset_render_states(d3d);
+ m_renderer->reset_render_states();
}
// release our reference to the target surface
- (*d3dintf->surface.release)(surface);
-}
-
-
-
-//============================================================
-// texture_find
-//============================================================
-
-static d3d_texture_info *texture_find(d3d_info *d3d, const render_primitive *prim)
-{
- UINT32 texhash = texture_compute_hash(&prim->texture, prim->flags);
- d3d_texture_info *texture;
-
- // find a match
- for (texture = d3d->texlist; texture != NULL; texture = texture->next)
- {
- UINT32 test_screen = (UINT32)texture->texinfo.osddata >> 1;
- UINT32 test_page = (UINT32)texture->texinfo.osddata & 1;
- UINT32 prim_screen = (UINT32)prim->texture.osddata >> 1;
- UINT32 prim_page = (UINT32)prim->texture.osddata & 1;
- if (test_screen != prim_screen || test_page != prim_page)
- {
- continue;
- }
-
- if (texture->hash == texhash &&
- texture->texinfo.base == prim->texture.base &&
- texture->texinfo.width == prim->texture.width &&
- texture->texinfo.height == prim->texture.height &&
- ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
- {
- // Reject a texture if it belongs to an out-of-date render target, so as to cause the HLSL system to re-cache
- if (d3d->hlsl->enabled() && prim->texture.width != 0 && prim->texture.height != 0 && (prim->flags & PRIMFLAG_SCREENTEX_MASK) != 0)
- {
- if (d3d->hlsl->find_render_target(texture) != NULL)
- {
- return texture;
- }
- }
- else
- {
- return texture;
- }
- }
- }
-
- // nothing found, check if we need to unregister something with hlsl
- if (d3d->hlsl->enabled())
- {
- if (prim->texture.width == 0 || prim->texture.height == 0)
- {
- return NULL;
- }
-
- UINT32 prim_screen = (UINT32)prim->texture.osddata >> 1;
- UINT32 prim_page = (UINT32)prim->texture.osddata & 1;
-
- for (texture = d3d->texlist; texture != NULL; texture = texture->next)
- {
- UINT32 test_screen = (UINT32)texture->texinfo.osddata >> 1;
- UINT32 test_page = (UINT32)texture->texinfo.osddata & 1;
- if (test_screen != prim_screen || test_page != prim_page)
- {
- continue;
- }
-
- // Clear our old texture reference
- if (texture->hash == texhash &&
- texture->texinfo.base == prim->texture.base &&
- ((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0 &&
- (texture->texinfo.width != prim->texture.width ||
- texture->texinfo.height != prim->texture.height))
- {
- d3d->hlsl->remove_render_target(texture);
- break;
- }
- }
- }
- return NULL;
-}
-
-
-//============================================================
-// texture_update
-//============================================================
-
-static void texture_update(d3d_info *d3d, const render_primitive *prim)
-{
- d3d_texture_info *texture = texture_find(d3d, prim);
-
- // if we didn't find one, create a new texture
- if (texture == NULL)
- {
- texture = texture_create(d3d, &prim->texture, prim->flags);
- }
-
- // if we found it, but with a different seqid, copy the data
- if (texture->texinfo.seqid != prim->texture.seqid)
- {
- texture_set_data(d3d, texture, &prim->texture, prim->flags);
- texture->texinfo.seqid = prim->texture.seqid;
- }
+ (*d3dintf->surface.release)(scale_surface);
}
//============================================================
-// d3d_cache_target::~d3d_cache_target
+// cache_target::~cache_target
//============================================================
-d3d_cache_target::~d3d_cache_target()
+cache_target::~cache_target()
{
for (int index = 0; index < 11; index++)
{
@@ -2746,32 +2823,29 @@ d3d_cache_target::~d3d_cache_target()
//============================================================
-// d3d_cache_target::init - initializes a target cache
+// cache_target::init - initializes a target cache
//============================================================
-bool d3d_cache_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom)
+bool cache_target::init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y)
{
- if (bloom)
- {
- int bloom_size = (width * prescale_x < height * prescale_y) ? width * prescale_x : height * prescale_y;
- int bloom_index = 0;
- int bloom_width = width * prescale_x;
- int bloom_height = height * prescale_y;
- for (; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
+ int bloom_size = (width * prescale_x < height * prescale_y) ? width * prescale_x : height * prescale_y;
+ int bloom_index = 0;
+ int bloom_width = width * prescale_x;
+ int bloom_height = height * prescale_y;
+ for (; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
+ {
+ bloom_width >>= 1;
+ bloom_height >>= 1;
+ HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), bloom_width, bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index]);
+ if (result != D3D_OK)
{
- bloom_width >>= 1;
- bloom_height >>= 1;
- HRESULT result = (*d3dintf->device.create_texture)(d3d->device, bloom_width, bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index]);
- if (result != D3D_OK)
- {
- return false;
- }
- (*d3dintf->texture.get_surface_level)(bloom_texture[bloom_index], 0, &bloom_target[bloom_index]);
- bloom_index++;
+ return false;
}
+ (*d3dintf->texture.get_surface_level)(bloom_texture[bloom_index], 0, &bloom_target[bloom_index]);
+ bloom_index++;
}
- HRESULT result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture);
+ HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &last_texture);
if (result != D3D_OK)
return false;
(*d3dintf->texture.get_surface_level)(last_texture, 0, &last_target);
@@ -2783,10 +2857,10 @@ bool d3d_cache_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int hei
}
//============================================================
-// d3d_render_target::~d3d_render_target
+// render_target::~render_target
//============================================================
-d3d_render_target::~d3d_render_target()
+render_target::~render_target()
{
for (int index = 0; index < 11; index++)
{
@@ -2804,10 +2878,10 @@ d3d_render_target::~d3d_render_target()
for (int index = 0; index < 5; index++)
{
- if (texture[index] != NULL)
+ if (render_texture[index] != NULL)
{
- (*d3dintf->texture.release)(texture[index]);
- texture[index] = NULL;
+ (*d3dintf->texture.release)(render_texture[index]);
+ render_texture[index] = NULL;
}
if (target[index] != NULL)
{
@@ -2841,72 +2915,61 @@ d3d_render_target::~d3d_render_target()
//============================================================
-// d3d_render_target::init - initializes a render target
+// render_target::init - initializes a render target
//============================================================
-bool d3d_render_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom)
+bool render_target::init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y)
{
- D3DFORMAT format = bloom ? D3DFMT_A16B16G16R16F : D3DFMT_A8R8G8B8;
+ D3DFORMAT format = D3DFMT_A8R8G8B8;
- HRESULT result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture[0]);
+ HRESULT result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[0]);
if (result != D3D_OK)
return false;
- (*d3dintf->texture.get_surface_level)(texture[0], 0, &target[0]);
+ (*d3dintf->texture.get_surface_level)(render_texture[0], 0, &target[0]);
- result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture[1]);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[1]);
if (result != D3D_OK)
return false;
- (*d3dintf->texture.get_surface_level)(texture[1], 0, &target[1]);
+ (*d3dintf->texture.get_surface_level)(render_texture[1], 0, &target[1]);
- result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture[2]);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &render_texture[2]);
if (result != D3D_OK)
return false;
- (*d3dintf->texture.get_surface_level)(texture[2], 0, &target[2]);
+ (*d3dintf->texture.get_surface_level)(render_texture[2], 0, &target[2]);
- if (!bloom)
- {
- result = (*d3dintf->device.create_texture)(d3d->device, width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[3]);
- if (result != D3D_OK)
- return false;
- (*d3dintf->texture.get_surface_level)(texture[3], 0, &target[3]);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &render_texture[3]);
+ if (result != D3D_OK)
+ return false;
+ (*d3dintf->texture.get_surface_level)(render_texture[3], 0, &target[3]);
- result = (*d3dintf->device.create_texture)(d3d->device, width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &texture[4]);
- if (result != D3D_OK)
- return false;
- (*d3dintf->texture.get_surface_level)(texture[4], 0, &target[4]);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &render_texture[4]);
+ if (result != D3D_OK)
+ return false;
+ (*d3dintf->texture.get_surface_level)(render_texture[4], 0, &target[4]);
- result = (*d3dintf->device.create_texture)(d3d->device, width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture);
- if (result != D3D_OK)
- return false;
- (*d3dintf->texture.get_surface_level)(smalltexture, 0, &smalltarget);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width, height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &smalltexture);
+ if (result != D3D_OK)
+ return false;
+ (*d3dintf->texture.get_surface_level)(smalltexture, 0, &smalltarget);
- result = (*d3dintf->device.create_texture)(d3d->device, width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture);
- if (result != D3D_OK)
- return false;
- (*d3dintf->texture.get_surface_level)(prescaletexture, 0, &prescaletarget);
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), width * prescale_x, height * prescale_y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &prescaletexture);
+ if (result != D3D_OK)
+ return false;
+ (*d3dintf->texture.get_surface_level)(prescaletexture, 0, &prescaletarget);
- for (int index = 0; index < 11; index++)
- {
- bloom_texture[index] = NULL;
- bloom_target[index] = NULL;
- }
- }
- else
+ int bloom_size = (d3d->get_width() < d3d->get_height()) ? d3d->get_width() : d3d->get_height();
+ int bloom_index = 0;
+ int bloom_width = d3d->get_width();
+ int bloom_height = d3d->get_height();
+ for (; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
{
- int bloom_size = (width < height) ? width : height;
- int bloom_index = 0;
- int bloom_width = width;
- int bloom_height = height;
- for (; bloom_size >= 2 && bloom_index < 11; bloom_size >>= 1)
- {
- bloom_width >>= 1;
- bloom_height >>= 1;
- result = (*d3dintf->device.create_texture)(d3d->device, bloom_width, bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index]);
- if (result != D3D_OK)
- return false;
- (*d3dintf->texture.get_surface_level)(bloom_texture[bloom_index], 0, &bloom_target[bloom_index]);
- bloom_index++;
- }
+ bloom_width >>= 1;
+ bloom_height >>= 1;
+ result = (*d3dintf->device.create_texture)(d3d->get_device(), bloom_width, bloom_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bloom_texture[bloom_index]);
+ if (result != D3D_OK)
+ return false;
+ (*d3dintf->texture.get_surface_level)(bloom_texture[bloom_index], 0, &bloom_target[bloom_index]);
+ bloom_index++;
}
target_width = width * prescale_x;
@@ -2914,3 +2977,5 @@ bool d3d_render_target::init(d3d_info *d3d, d3d_base *d3dintf, int width, int he
return true;
}
+
+}; \ No newline at end of file
diff --git a/src/osd/windows/drawd3d.h b/src/osd/windows/drawd3d.h
index a4e3ef40c19..8cc464f090b 100644
--- a/src/osd/windows/drawd3d.h
+++ b/src/osd/windows/drawd3d.h
@@ -51,26 +51,31 @@
//============================================================
#define VERTEX_BASE_FORMAT (D3DFVF_DIFFUSE | D3DFVF_TEX1)
-#define VERTEX_BUFFER_SIZE (2048*4+4)
+#define VERTEX_BUFFER_SIZE (10240*4+4)
//============================================================
// TYPE DEFINITIONS
//============================================================
-struct d3d_info;
+namespace d3d
+{
+
+class cache_target;
+class render_target;
+class renderer;
-/* d3d_cache_target is a simple linked list containing only a rednerable target and texture, used for phosphor effects */
-class d3d_cache_target
+/* cache_target is a simple linked list containing only a rednerable target and texture, used for phosphor effects */
+class cache_target
{
public:
// construction/destruction
- d3d_cache_target() { }
- ~d3d_cache_target();
+ cache_target() { }
+ ~cache_target();
- bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom);
+ bool init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y);
- d3d_surface *last_target;
- d3d_texture *last_texture;
+ surface *last_target;
+ texture *last_texture;
int target_width;
int target_height;
@@ -80,22 +85,22 @@ public:
int screen_index;
- d3d_cache_target *next;
- d3d_cache_target *prev;
+ cache_target *next;
+ cache_target *prev;
- d3d_surface *bloom_target[11];
- d3d_texture *bloom_texture[11];
+ surface *bloom_target[11];
+ texture *bloom_texture[11];
};
-/* d3d_render_target is the information about a Direct3D render target chain */
-class d3d_render_target
+/* render_target is the information about a Direct3D render target chain */
+class render_target
{
public:
// construction/destruction
- d3d_render_target() { }
- ~d3d_render_target();
+ render_target() { }
+ ~render_target();
- bool init(d3d_info *d3d, d3d_base *d3dintf, int width, int height, int prescale_x, int prescale_y, bool bloom = false);
+ bool init(renderer *d3d, base *d3dintf, int width, int height, int prescale_x, int prescale_y);
int target_width;
int target_height;
@@ -106,85 +111,148 @@ public:
int screen_index;
int page_index;
- d3d_surface *prescaletarget;
- d3d_texture *prescaletexture;
- d3d_surface *smalltarget;
- d3d_texture *smalltexture;
- d3d_surface *target[5];
- d3d_texture *texture[5];
+ surface *prescaletarget;
+ texture *prescaletexture;
+ surface *smalltarget;
+ texture *smalltexture;
+ surface *target[5];
+ texture *render_texture[5];
- d3d_render_target *next;
- d3d_render_target *prev;
+ render_target *next;
+ render_target *prev;
- d3d_surface *bloom_target[11];
- d3d_texture *bloom_texture[11];
+ surface *bloom_target[11];
+ texture *bloom_texture[11];
};
-/* d3d_info is the information about Direct3D for the current screen */
-struct d3d_info
+/* renderer is the information about Direct3D for the current screen */
+class renderer
{
- int adapter; // ordinal adapter number
- int width, height; // current width, height
- int refresh; // current refresh rate
- int create_error_count; // number of consecutive create errors
-
- win_window_info * window; // current window info
-
- d3d_device * device; // pointer to the Direct3DDevice object
- int gamma_supported; // is full screen gamma supported?
- d3d_present_parameters presentation; // set of presentation parameters
- D3DDISPLAYMODE origmode; // original display mode for the adapter
- D3DFORMAT pixformat; // pixel format we are using
-
- d3d_vertex_buffer * vertexbuf; // pointer to the vertex buffer object
- d3d_vertex * lockedbuf; // pointer to the locked vertex buffer
- int numverts; // number of accumulated vertices
-
- d3d_poly_info poly[VERTEX_BUFFER_SIZE/3]; // array to hold polygons as they are created
- int numpolys; // number of accumulated polygons
-
- bool restarting; // if we're restarting
-
- d3d_texture_info * texlist; // list of active textures
- int dynamic_supported; // are dynamic textures supported?
- int stretch_supported; // is StretchRect with point filtering supported?
- int mod2x_supported; // is D3DTOP_MODULATE2X supported?
- int mod4x_supported; // is D3DTOP_MODULATE4X supported?
- D3DFORMAT screen_format; // format to use for screen textures
- D3DFORMAT yuv_format; // format to use for YUV textures
-
- DWORD texture_caps; // textureCaps field
- DWORD texture_max_aspect; // texture maximum aspect ratio
- DWORD texture_max_width; // texture maximum width
- DWORD texture_max_height; // texture maximum height
-
- d3d_texture_info * last_texture; // previous texture
- UINT32 last_texture_flags; // previous texture flags
- int last_blendenable; // previous blendmode
- int last_blendop; // previous blendmode
- int last_blendsrc; // previous blendmode
- int last_blenddst; // previous blendmode
- int last_filter; // previous texture filter
- int last_wrap; // previous wrap state
- DWORD last_modmode; // previous texture modulation
-
- bitmap_argb32 vector_bitmap; // experimental: bitmap for vectors
- d3d_texture_info * vector_texture; // experimental: texture for vectors
-
- bitmap_rgb32 default_bitmap; // experimental: default bitmap
- d3d_texture_info * default_texture; // experimental: default texture
-
- void * hlsl_buf; // HLSL vertex data
- hlsl_info * hlsl; // HLSL interface
-};
+public:
+ renderer() { }
+ renderer(win_window_info *window);
+ ~renderer();
+ int initialize();
+ int device_create();
+ int device_create_resources();
+ void device_delete();
+ void device_delete_resources();
-//============================================================
-// PROTOTYPES
-//============================================================
+ int device_verify_caps();
+ int device_test_cooperative();
+
+ int config_adapter_mode();
+ void pick_best_mode();
+ int get_adapter_for_monitor();
+
+ int update_window_size();
+
+ int pre_window_draw_check();
+ void begin_frame();
+ void end_frame();
+
+ void draw_line(const render_primitive *prim);
+ void draw_quad(const render_primitive *prim);
+ void batch_vector(const render_primitive *prim, float line_time);
+ void batch_vectors();
+
+ vertex * mesh_alloc(int numverts);
+
+ void update_textures();
+
+ void process_primitives();
+ void primitive_flush_pending();
+
+ void set_texture(texture_info *texture);
+ void set_filter(int filter);
+ void set_wrap(D3DTEXTUREADDRESS wrap);
+ void set_modmode(DWORD modmode);
+ void set_blendmode(int blendmode);
+ void reset_render_states();
+
+ // Setters / getters
+ int get_adapter() { return m_adapter; }
+ int get_width() { return m_width; }
+ int get_height() { return m_height; }
+ int get_refresh() { return m_refresh; }
+
+ win_window_info * get_window() { return m_window; }
+
+ device * get_device() { return m_device; }
+ present_parameters * get_presentation() { return &m_presentation; }
+
+ vertex_buffer * get_vertex_buffer() { return m_vertexbuf; }
+ vertex * get_locked_buffer() { return m_lockedbuf; }
+ VOID ** get_locked_buffer_ptr() { return (VOID **)&m_lockedbuf; }
+ void set_locked_buffer(vertex *lockedbuf) { m_lockedbuf = lockedbuf; }
+
+ void set_restarting(bool restarting) { m_restarting = restarting; }
+ bool is_mod2x_supported() { return (bool)m_mod2x_supported; }
+ bool is_mod4x_supported() { return (bool)m_mod4x_supported; }
-d3d_texture_info *texture_create(d3d_info *d3d, const render_texinfo *texsource, UINT32 flags);
-void texture_destroy(d3d_info *d3d, d3d_texture_info *info);
+ D3DFORMAT get_screen_format() { return m_screen_format; }
+ D3DFORMAT get_pixel_format() { return m_pixformat; }
+ D3DDISPLAYMODE get_origmode() { return m_origmode; }
+
+ UINT32 get_last_texture_flags() { return m_last_texture_flags; }
+
+ texture_manager * get_texture_manager() { return m_texture_manager; }
+ texture_info * get_default_texture() { return m_texture_manager->get_default_texture(); }
+ texture_info * get_vector_texture() { return m_texture_manager->get_vector_texture(); }
+
+ shaders * get_shaders() { return m_shaders; }
+
+private:
+ int m_adapter; // ordinal adapter number
+ int m_width; // current width
+ int m_height; // current height
+ int m_refresh; // current refresh rate
+ int m_create_error_count; // number of consecutive create errors
+
+ win_window_info * m_window; // current window info
+
+ device * m_device; // pointer to the Direct3DDevice object
+ int m_gamma_supported; // is full screen gamma supported?
+ present_parameters m_presentation; // set of presentation parameters
+ D3DDISPLAYMODE m_origmode; // original display mode for the adapter
+ D3DFORMAT m_pixformat; // pixel format we are using
+
+ vertex_buffer * m_vertexbuf; // pointer to the vertex buffer object
+ vertex * m_lockedbuf; // pointer to the locked vertex buffer
+ int m_numverts; // number of accumulated vertices
+
+ vertex * m_vectorbatch; // pointer to the vector batch buffer
+ int m_batchindex; // current index into the vector batch
+
+ poly_info m_poly[VERTEX_BUFFER_SIZE/3];// array to hold polygons as they are created
+ int m_numpolys; // number of accumulated polygons
+
+ bool m_restarting; // if we're restarting
+
+ int m_mod2x_supported; // is D3DTOP_MODULATE2X supported?
+ int m_mod4x_supported; // is D3DTOP_MODULATE4X supported?
+ D3DFORMAT m_screen_format; // format to use for screen textures
+
+ texture_info * m_last_texture; // previous texture
+ UINT32 m_last_texture_flags; // previous texture flags
+ int m_last_blendenable; // previous blendmode
+ int m_last_blendop; // previous blendmode
+ int m_last_blendsrc; // previous blendmode
+ int m_last_blenddst; // previous blendmode
+ int m_last_filter; // previous texture filter
+ D3DTEXTUREADDRESS m_last_wrap; // previous wrap state
+ DWORD m_last_modmode; // previous texture modulation
+
+ void * m_hlsl_buf; // HLSL vertex data
+ shaders * m_shaders; // HLSL interface
+
+ texture_manager * m_texture_manager; // texture manager
+
+ int m_line_count;
+};
+
+};
#endif
diff --git a/src/osd/windows/windows.mak b/src/osd/windows/windows.mak
index b0241502c74..e47f84c3ca2 100644
--- a/src/osd/windows/windows.mak
+++ b/src/osd/windows/windows.mak
@@ -322,11 +322,7 @@ OSDOBJS += \
$(WINOBJ)/netdev_pcap.o
endif
-ifeq ($(DIRECT3D),9)
CCOMFLAGS += -DDIRECT3D_VERSION=0x0900
-else
-OSDOBJS += $(WINOBJ)/d3d8intf.o
-endif
# extra dependencies
$(WINOBJ)/drawdd.o : $(SRC)/emu/rendersw.c
diff --git a/src/osd/windows/winmain.c b/src/osd/windows/winmain.c
index 8fd2640ee9a..255c7cdc89c 100644
--- a/src/osd/windows/winmain.c
+++ b/src/osd/windows/winmain.c
@@ -329,7 +329,6 @@ const options_entry windows_options::s_option_entries[] =
// Direct3D-specific options
{ NULL, NULL, OPTION_HEADER, "DIRECT3D-SPECIFIC OPTIONS" },
- { WINOPTION_D3DVERSION "(8-9)", "9", OPTION_INTEGER, "specify the preferred Direct3D version (8 or 9)" },
{ WINOPTION_FILTER ";d3dfilter;flt", "1", OPTION_BOOLEAN, "enable bilinear filtering on screen output" },
// post-processing options
@@ -397,6 +396,19 @@ const options_entry windows_options::s_option_entries[] =
{ WINOPTION_VECTOR_TIME_PERIOD";vecperiod", "0.1", OPTION_FLOAT, "Vector fade rate versus screen refresh rate" },
{ WINOPTION_VECTOR_LENGTH_SCALE";veclength", "0.9", OPTION_FLOAT, "How much length affects vector fade" },
{ WINOPTION_VECTOR_LENGTH_RATIO";vecsize", "4.0", OPTION_FLOAT, "Vector fade length (4.0 - vectors fade the most at and above 4 pixels, etc.)" },
+ /* Bloom below this line */
+ { NULL, NULL, OPTION_HEADER, "BLOOM POST-PROCESSING OPTIONS" },
+ { WINOPTION_BLOOM_LEVEL0_WEIGHT, "1.0", OPTION_FLOAT, "Bloom level 0 (full-size target) weight" },
+ { WINOPTION_BLOOM_LEVEL1_WEIGHT, "0.21", OPTION_FLOAT, "Bloom level 1 (half-size target) weight" },
+ { WINOPTION_BLOOM_LEVEL2_WEIGHT, "0.19", OPTION_FLOAT, "Bloom level 2 (quarter-size target) weight" },
+ { WINOPTION_BLOOM_LEVEL3_WEIGHT, "0.17", OPTION_FLOAT, "Bloom level 3 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL4_WEIGHT, "0.15", OPTION_FLOAT, "Bloom level 4 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL5_WEIGHT, "0.14", OPTION_FLOAT, "Bloom level 5 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL6_WEIGHT, "0.13", OPTION_FLOAT, "Bloom level 6 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL7_WEIGHT, "0.12", OPTION_FLOAT, "Bloom level 7 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL8_WEIGHT, "0.11", OPTION_FLOAT, "Bloom level 8 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL9_WEIGHT, "0.10", OPTION_FLOAT, "Bloom level 9 (.) weight" },
+ { WINOPTION_BLOOM_LEVEL10_WEIGHT, "0.09", OPTION_FLOAT, "Bloom level 10 (1x1 target) weight" },
// per-window options
{ NULL, NULL, OPTION_HEADER, "PER-WINDOW VIDEO OPTIONS" },
diff --git a/src/osd/windows/winmain.h b/src/osd/windows/winmain.h
index eb3b234643e..8f3b9684b20 100644
--- a/src/osd/windows/winmain.h
+++ b/src/osd/windows/winmain.h
@@ -75,7 +75,6 @@
#define WINOPTION_HWSTRETCH "hwstretch"
// Direct3D-specific options
-#define WINOPTION_D3DVERSION "d3dversion"
#define WINOPTION_FILTER "filter"
// core post-processing options
@@ -134,6 +133,17 @@
#define WINOPTION_VECTOR_TIME_PERIOD "vector_time_period"
#define WINOPTION_VECTOR_LENGTH_SCALE "vector_length_scale"
#define WINOPTION_VECTOR_LENGTH_RATIO "vector_length_ratio"
+#define WINOPTION_BLOOM_LEVEL0_WEIGHT "bloom_lvl0_weight"
+#define WINOPTION_BLOOM_LEVEL1_WEIGHT "bloom_lvl1_weight"
+#define WINOPTION_BLOOM_LEVEL2_WEIGHT "bloom_lvl2_weight"
+#define WINOPTION_BLOOM_LEVEL3_WEIGHT "bloom_lvl3_weight"
+#define WINOPTION_BLOOM_LEVEL4_WEIGHT "bloom_lvl4_weight"
+#define WINOPTION_BLOOM_LEVEL5_WEIGHT "bloom_lvl5_weight"
+#define WINOPTION_BLOOM_LEVEL6_WEIGHT "bloom_lvl6_weight"
+#define WINOPTION_BLOOM_LEVEL7_WEIGHT "bloom_lvl7_weight"
+#define WINOPTION_BLOOM_LEVEL8_WEIGHT "bloom_lvl8_weight"
+#define WINOPTION_BLOOM_LEVEL9_WEIGHT "bloom_lvl9_weight"
+#define WINOPTION_BLOOM_LEVEL10_WEIGHT "bloom_lvl10_weight"
// per-window options
#define WINOPTION_SCREEN "screen"
@@ -194,7 +204,6 @@ public:
bool hwstretch() const { return bool_value(WINOPTION_HWSTRETCH); }
// Direct3D-specific options
- int d3d_version() const { return int_value(WINOPTION_D3DVERSION); }
bool filter() const { return bool_value(WINOPTION_FILTER); }
// core post-processing options
@@ -247,6 +256,17 @@ public:
float screen_vector_time_period() const { return float_value(WINOPTION_VECTOR_TIME_PERIOD); }
float screen_vector_length_scale() const { return float_value(WINOPTION_VECTOR_LENGTH_SCALE); }
float screen_vector_length_ratio() const { return float_value(WINOPTION_VECTOR_LENGTH_RATIO); }
+ float screen_bloom_lvl0_weight() const { return float_value(WINOPTION_BLOOM_LEVEL0_WEIGHT); }
+ float screen_bloom_lvl1_weight() const { return float_value(WINOPTION_BLOOM_LEVEL1_WEIGHT); }
+ float screen_bloom_lvl2_weight() const { return float_value(WINOPTION_BLOOM_LEVEL2_WEIGHT); }
+ float screen_bloom_lvl3_weight() const { return float_value(WINOPTION_BLOOM_LEVEL3_WEIGHT); }
+ float screen_bloom_lvl4_weight() const { return float_value(WINOPTION_BLOOM_LEVEL4_WEIGHT); }
+ float screen_bloom_lvl5_weight() const { return float_value(WINOPTION_BLOOM_LEVEL5_WEIGHT); }
+ float screen_bloom_lvl6_weight() const { return float_value(WINOPTION_BLOOM_LEVEL6_WEIGHT); }
+ float screen_bloom_lvl7_weight() const { return float_value(WINOPTION_BLOOM_LEVEL7_WEIGHT); }
+ float screen_bloom_lvl8_weight() const { return float_value(WINOPTION_BLOOM_LEVEL8_WEIGHT); }
+ float screen_bloom_lvl9_weight() const { return float_value(WINOPTION_BLOOM_LEVEL9_WEIGHT); }
+ float screen_bloom_lvl10_weight() const { return float_value(WINOPTION_BLOOM_LEVEL10_WEIGHT); }
const char *screen_offset() const { return value(WINOPTION_OFFSET); }
const char *screen_scale() const { return value(WINOPTION_SCALE); }
const char *screen_power() const { return value(WINOPTION_POWER); }