diff options
author | 2013-05-19 16:21:26 +0000 | |
---|---|---|
committer | 2013-05-19 16:21:26 +0000 | |
commit | e028e20476411120097970a13098ce57ebe66ced (patch) | |
tree | d1f2ee37875ee7ab1df3ef7cd864766b1f02884f | |
parent | ec5c9bc680ab64ab57f2e89312e80c0aefa2036c (diff) |
- "And he did give them CRT bloom, and it scorched their eyes so; and they wept
openly, for there was nothing left to see with" [MooglyGuy]
* Enabled vector bloom and associated .ini controls
* Added raster bloom and associated .ini controls, each bloom "level" is the
linear weight of successively half-sized render targets
* Removed D3D8 mode
* Mass renaming in D3D renderer to use namespaces, initial planning step to
HAL-based renderer implementation on Windows (i.e., GL on Windows)
* Converted d3d_info, d3d_poly_info, and d3d_texture_info into classes
* Added batching of vectors for possible speed increase
* Minor cleanup of shader state setting
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | hlsl/bloom.fx | 88 | ||||
-rw-r--r-- | hlsl/color.fx | 10 | ||||
-rw-r--r-- | hlsl/deconverge.fx | 72 | ||||
-rw-r--r-- | hlsl/downsample.fx | 30 | ||||
-rw-r--r-- | hlsl/focus.fx | 2 | ||||
-rw-r--r-- | hlsl/phosphor.fx | 4 | ||||
-rw-r--r-- | hlsl/post.fx | 23 | ||||
-rw-r--r-- | hlsl/prescale.fx | 22 | ||||
-rw-r--r-- | hlsl/yiq_decode.fx | 19 | ||||
-rw-r--r-- | hlsl/yiq_encode.fx | 28 | ||||
-rw-r--r-- | src/emu/render.c | 5 | ||||
-rw-r--r-- | src/osd/windows/d3d8intf.c | 707 | ||||
-rw-r--r-- | src/osd/windows/d3d9intf.c | 255 | ||||
-rw-r--r-- | src/osd/windows/d3dcomm.h | 223 | ||||
-rw-r--r-- | src/osd/windows/d3dhlsl.c | 976 | ||||
-rw-r--r-- | src/osd/windows/d3dhlsl.h | 139 | ||||
-rw-r--r-- | src/osd/windows/d3dintf.h | 171 | ||||
-rw-r--r-- | src/osd/windows/drawd3d.c | 2375 | ||||
-rw-r--r-- | src/osd/windows/drawd3d.h | 246 | ||||
-rw-r--r-- | src/osd/windows/windows.mak | 4 | ||||
-rw-r--r-- | src/osd/windows/winmain.c | 14 | ||||
-rw-r--r-- | src/osd/windows/winmain.h | 24 |
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); } |