From e79e28598bfc315a012822767207cc16f6321021 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sun, 29 Oct 2023 22:26:58 -0700 Subject: [PATCH] libobs,obs-filters: Use common straight alpha math This pattern uses fewer instructions and also avoids using max, which does not work on infinity. Also remove unreferenced techniques from scale filters. --- libobs/data/area.effect | 16 ---------------- libobs/data/bicubic_scale.effect | 16 ---------------- libobs/data/bilinear_lowres_scale.effect | 16 ---------------- libobs/data/default.effect | 7 +++---- libobs/data/lanczos_scale.effect | 16 ---------------- plugins/obs-filters/data/blend_add_filter.effect | 2 +- plugins/obs-filters/data/blend_mul_filter.effect | 2 +- plugins/obs-filters/data/blend_sub_filter.effect | 2 +- .../obs-filters/data/chroma_key_filter.effect | 2 +- .../obs-filters/data/chroma_key_filter_v2.effect | 2 +- .../data/color_correction_filter.effect | 2 +- .../obs-filters/data/color_grade_filter.effect | 8 ++++---- plugins/obs-filters/data/color_key_filter.effect | 2 +- .../obs-filters/data/color_key_filter_v2.effect | 2 +- plugins/obs-filters/data/luma_key_filter.effect | 2 +- .../obs-filters/data/luma_key_filter_v2.effect | 2 +- .../obs-filters/data/mask_alpha_filter.effect | 2 +- .../obs-filters/data/mask_color_filter.effect | 2 +- 18 files changed, 19 insertions(+), 84 deletions(-) diff --git a/libobs/data/area.effect b/libobs/data/area.effect index c54ab1bfc..6632e5a60 100644 --- a/libobs/data/area.effect +++ b/libobs/data/area.effect @@ -117,13 +117,6 @@ float4 PSDrawAreaRGBAMultiplyTonemap(FragData frag_in) : TARGET return rgba; } -float4 PSDrawAreaRGBADivide(FragData frag_in) : TARGET -{ - float4 rgba = DrawArea(frag_in); - rgba.rgb *= max(1. / rgba.a, 0.); - return rgba; -} - float4 DrawAreaUpscale(FragData frag_in) { float2 uv = frag_in.uv; @@ -220,15 +213,6 @@ technique DrawMultiplyTonemap } } -technique DrawAlphaDivide -{ - pass - { - vertex_shader = VSDefault(vert_in); - pixel_shader = PSDrawAreaRGBADivide(frag_in); - } -} - technique DrawUpscale { pass diff --git a/libobs/data/bicubic_scale.effect b/libobs/data/bicubic_scale.effect index 90216086e..e4b953cd2 100644 --- a/libobs/data/bicubic_scale.effect +++ b/libobs/data/bicubic_scale.effect @@ -163,13 +163,6 @@ float4 PSDrawBicubicRGBAMultiplyTonemap(FragData f_in, bool undistort) : TARGET return rgba; } -float4 PSDrawBicubicRGBADivide(FragData f_in) : TARGET -{ - float4 rgba = DrawBicubic(f_in, false); - rgba.rgb *= max(1. / rgba.a, 0.); - return rgba; -} - technique Draw { pass @@ -206,15 +199,6 @@ technique DrawMultiplyTonemap } } -technique DrawAlphaDivide -{ - pass - { - vertex_shader = VSDefault(v_in); - pixel_shader = PSDrawBicubicRGBADivide(f_in); - } -} - technique DrawUndistort { pass diff --git a/libobs/data/bilinear_lowres_scale.effect b/libobs/data/bilinear_lowres_scale.effect index 2ea6db0db..c693ff0ab 100644 --- a/libobs/data/bilinear_lowres_scale.effect +++ b/libobs/data/bilinear_lowres_scale.effect @@ -86,13 +86,6 @@ float4 PSDrawLowresBilinearRGBAMultiplyTonemap(VertData f_in) : TARGET return rgba; } -float4 PSDrawLowresBilinearRGBADivide(VertData f_in) : TARGET -{ - float4 rgba = DrawLowresBilinear(f_in); - rgba.rgb *= max(1. / rgba.a, 0.); - return rgba; -} - technique Draw { pass @@ -128,12 +121,3 @@ technique DrawMultiplyTonemap pixel_shader = PSDrawLowresBilinearRGBAMultiplyTonemap(f_in); } } - -technique DrawAlphaDivide -{ - pass - { - vertex_shader = VSDefault(v_in); - pixel_shader = PSDrawLowresBilinearRGBADivide(f_in); - } -} diff --git a/libobs/data/default.effect b/libobs/data/default.effect index 7ad4bb5b1..2c93982d7 100644 --- a/libobs/data/default.effect +++ b/libobs/data/default.effect @@ -31,14 +31,14 @@ float4 PSDrawBare(VertInOut vert_in) : TARGET float4 PSDrawAlphaDivide(VertInOut vert_in) : TARGET { float4 rgba = image.Sample(def_sampler, vert_in.uv); - rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : float3(0., 0., 0.); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; return rgba; } float4 PSDrawAlphaDivideTonemap(VertInOut vert_in) : TARGET { float4 rgba = image.Sample(def_sampler, vert_in.uv); - rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : float3(0., 0., 0.); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba.rgb = rec709_to_rec2020(rgba.rgb); rgba.rgb = reinhard(rgba.rgb); rgba.rgb = rec2020_to_rec709(rgba.rgb); @@ -48,8 +48,7 @@ float4 PSDrawAlphaDivideTonemap(VertInOut vert_in) : TARGET float4 PSDrawAlphaDivideR10L(VertInOut vert_in) : TARGET { float4 rgba = image.Sample(def_sampler, vert_in.uv); - rgba.rgb = (rgba.a > 0.) ? (rgba.rgb / rgba.a) : float3(0., 0., 0.); - rgba.rgb *= multiplier; + rgba.rgb *= (rgba.a > 0.) ? (multiplier / rgba.a) : 0.; rgba.rgb = rec709_to_rec2020(rgba.rgb); rgba.rgb = linear_to_st2084(rgba.rgb); uint3 rgb1023 = uint3(mad(rgba.rgb, 1023., .5)); diff --git a/libobs/data/lanczos_scale.effect b/libobs/data/lanczos_scale.effect index 5dc8d71a8..6d3e9e0b5 100644 --- a/libobs/data/lanczos_scale.effect +++ b/libobs/data/lanczos_scale.effect @@ -219,13 +219,6 @@ float4 PSDrawLanczosRGBAMultiplyTonemap(FragData f_in, bool undistort) : TARGET return rgba; } -float4 PSDrawLanczosRGBADivide(FragData f_in) : TARGET -{ - float4 rgba = DrawLanczos(f_in, false); - rgba.rgb *= max(1. / rgba.a, 0.); - return rgba; -} - technique Draw { pass @@ -262,15 +255,6 @@ technique DrawMultiplyTonemap } } -technique DrawAlphaDivide -{ - pass - { - vertex_shader = VSDefault(v_in); - pixel_shader = PSDrawLanczosRGBADivide(f_in); - } -} - technique DrawUndistort { pass diff --git a/plugins/obs-filters/data/blend_add_filter.effect b/plugins/obs-filters/data/blend_add_filter.effect index 196837b67..ce7da1c74 100644 --- a/plugins/obs-filters/data/blend_add_filter.effect +++ b/plugins/obs-filters/data/blend_add_filter.effect @@ -35,7 +35,7 @@ VertDataOut VSDefault(VertDataIn v_in) float4 PSAddImageRGBA(VertDataOut v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; float3 targetRGB = target.Sample(textureSampler, v_in.uv2).rgb; diff --git a/plugins/obs-filters/data/blend_mul_filter.effect b/plugins/obs-filters/data/blend_mul_filter.effect index a1a45b288..46a8e10e7 100644 --- a/plugins/obs-filters/data/blend_mul_filter.effect +++ b/plugins/obs-filters/data/blend_mul_filter.effect @@ -35,7 +35,7 @@ VertDataOut VSDefault(VertDataIn v_in) float4 PSMuliplyImageRGBA(VertDataOut v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; float3 targetRGB = target.Sample(textureSampler, v_in.uv2).rgb; diff --git a/plugins/obs-filters/data/blend_sub_filter.effect b/plugins/obs-filters/data/blend_sub_filter.effect index d01e46cdc..5e079ed69 100644 --- a/plugins/obs-filters/data/blend_sub_filter.effect +++ b/plugins/obs-filters/data/blend_sub_filter.effect @@ -35,7 +35,7 @@ VertDataOut VSDefault(VertDataIn v_in) float4 PSSubtractImageRGBA(VertDataOut v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; float3 targetRGB = target.Sample(textureSampler, v_in.uv2).rgb; diff --git a/plugins/obs-filters/data/chroma_key_filter.effect b/plugins/obs-filters/data/chroma_key_filter.effect index c43753f07..d7e1ecc30 100644 --- a/plugins/obs-filters/data/chroma_key_filter.effect +++ b/plugins/obs-filters/data/chroma_key_filter.effect @@ -85,7 +85,7 @@ float4 ProcessChromaKey(float4 rgba, VertData v_in) float4 PSChromaKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; return ProcessChromaKey(rgba, v_in); } diff --git a/plugins/obs-filters/data/chroma_key_filter_v2.effect b/plugins/obs-filters/data/chroma_key_filter_v2.effect index 5f6545a11..5766fdbbd 100644 --- a/plugins/obs-filters/data/chroma_key_filter_v2.effect +++ b/plugins/obs-filters/data/chroma_key_filter_v2.effect @@ -95,7 +95,7 @@ float4 ProcessChromaKey(float4 rgba, VertData v_in) float4 PSChromaKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba = ProcessChromaKey(rgba, v_in); rgba.rgb *= rgba.a; return rgba; diff --git a/plugins/obs-filters/data/color_correction_filter.effect b/plugins/obs-filters/data/color_correction_filter.effect index 90473d4d7..5af4210e8 100644 --- a/plugins/obs-filters/data/color_correction_filter.effect +++ b/plugins/obs-filters/data/color_correction_filter.effect @@ -47,7 +47,7 @@ float4 PSColorFilterRGBA(VertData vert_in) : TARGET { /* Grab the current pixel to perform operations on. */ float4 currentPixel = image.Sample(textureSampler, vert_in.uv); - currentPixel.rgb = max(float3(0.0, 0.0, 0.0), currentPixel.rgb / currentPixel.a); + currentPixel.rgb *= (currentPixel.a > 0.) ? (1. / currentPixel.a) : 0.; /* Always address the gamma first. */ currentPixel.rgb = pow(currentPixel.rgb, float3(gamma, gamma, gamma)); diff --git a/plugins/obs-filters/data/color_grade_filter.effect b/plugins/obs-filters/data/color_grade_filter.effect index 2b902d7d4..1037b2f3e 100644 --- a/plugins/obs-filters/data/color_grade_filter.effect +++ b/plugins/obs-filters/data/color_grade_filter.effect @@ -47,7 +47,7 @@ float3 srgb_linear_to_nonlinear(float3 v) float4 LUT1D(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - textureColor.rgb = max(float3(0.0, 0.0, 0.0), textureColor.rgb / textureColor.a); + textureColor.rgb *= (textureColor.a > 0.) ? (1. / textureColor.a) : 0.; float3 nonlinear = srgb_linear_to_nonlinear(textureColor.rgb); if (nonlinear.r >= domain_min.r && nonlinear.r <= domain_max.r) { @@ -85,7 +85,7 @@ float4 LUT3D(VertDataOut v_in) : TARGET float4 LUTAlpha3D(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - textureColor.rgb = max(float3(0.0, 0.0, 0.0), textureColor.rgb / textureColor.a); + textureColor.rgb *= (textureColor.a > 0.) ? (1. / textureColor.a) : 0.; float3 nonlinear = srgb_linear_to_nonlinear(textureColor.rgb); float3 clut_uvw = nonlinear * clut_scale + clut_offset; @@ -98,7 +98,7 @@ float4 LUTAlpha3D(VertDataOut v_in) : TARGET float4 LUTAmount3D(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - textureColor.rgb = max(float3(0.0, 0.0, 0.0), textureColor.rgb / textureColor.a); + textureColor.rgb *= (textureColor.a > 0.) ? (1. / textureColor.a) : 0.; float3 nonlinear = srgb_linear_to_nonlinear(textureColor.rgb); float3 clut_uvw = nonlinear * clut_scale + clut_offset; @@ -112,7 +112,7 @@ float4 LUTAmount3D(VertDataOut v_in) : TARGET float4 LUTDomain3D(VertDataOut v_in) : TARGET { float4 textureColor = image.Sample(textureSampler, v_in.uv); - textureColor.rgb = max(float3(0.0, 0.0, 0.0), textureColor.rgb / textureColor.a); + textureColor.rgb *= (textureColor.a > 0.) ? (1. / textureColor.a) : 0.; float3 nonlinear = srgb_linear_to_nonlinear(textureColor.rgb); float r = nonlinear.r; diff --git a/plugins/obs-filters/data/color_key_filter.effect b/plugins/obs-filters/data/color_key_filter.effect index defb1bbca..543aa5f39 100644 --- a/plugins/obs-filters/data/color_key_filter.effect +++ b/plugins/obs-filters/data/color_key_filter.effect @@ -50,7 +50,7 @@ float4 ProcessColorKey(float4 rgba, VertData v_in) float4 PSColorKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; return ProcessColorKey(rgba, v_in); } diff --git a/plugins/obs-filters/data/color_key_filter_v2.effect b/plugins/obs-filters/data/color_key_filter_v2.effect index 1193633eb..5adb7f2cc 100644 --- a/plugins/obs-filters/data/color_key_filter_v2.effect +++ b/plugins/obs-filters/data/color_key_filter_v2.effect @@ -60,7 +60,7 @@ float4 ProcessColorKey(float4 rgba, VertData v_in) float4 PSColorKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba.a *= opacity; rgba = ProcessColorKey(rgba, v_in); rgba.rgb *= rgba.a; diff --git a/plugins/obs-filters/data/luma_key_filter.effect b/plugins/obs-filters/data/luma_key_filter.effect index 0b3831c1c..ef06e6417 100644 --- a/plugins/obs-filters/data/luma_key_filter.effect +++ b/plugins/obs-filters/data/luma_key_filter.effect @@ -28,7 +28,7 @@ VertData VSDefault(VertData v_in) float4 PSALumaKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; float4 lumaCoef = float4(0.2989, 0.5870, 0.1140, 0.0); diff --git a/plugins/obs-filters/data/luma_key_filter_v2.effect b/plugins/obs-filters/data/luma_key_filter_v2.effect index d70c3610d..29843cb74 100644 --- a/plugins/obs-filters/data/luma_key_filter_v2.effect +++ b/plugins/obs-filters/data/luma_key_filter_v2.effect @@ -28,7 +28,7 @@ VertData VSDefault(VertData v_in) float4 PSALumaKeyRGBA(VertData v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; float3 lumaCoef = float3(0.2126, 0.7152, 0.0722); diff --git a/plugins/obs-filters/data/mask_alpha_filter.effect b/plugins/obs-filters/data/mask_alpha_filter.effect index 262f0d95f..788a678f3 100644 --- a/plugins/obs-filters/data/mask_alpha_filter.effect +++ b/plugins/obs-filters/data/mask_alpha_filter.effect @@ -35,7 +35,7 @@ VertDataOut VSDefault(VertDataIn v_in) float4 PSAlphaMaskRGBA(VertDataOut v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; float4 targetRGB = target.Sample(textureSampler, v_in.uv2); diff --git a/plugins/obs-filters/data/mask_color_filter.effect b/plugins/obs-filters/data/mask_color_filter.effect index b65435573..d90b348fe 100644 --- a/plugins/obs-filters/data/mask_color_filter.effect +++ b/plugins/obs-filters/data/mask_color_filter.effect @@ -35,7 +35,7 @@ VertDataOut VSDefault(VertDataIn v_in) float4 PSColorMaskRGBA(VertDataOut v_in) : TARGET { float4 rgba = image.Sample(textureSampler, v_in.uv); - rgba.rgb = max(float3(0.0, 0.0, 0.0), rgba.rgb / rgba.a); + rgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.; rgba *= color; float4 targetRGB = target.Sample(textureSampler, v_in.uv2);