libobs: Add YUV alpha formats

This will allow YUV alpha formats to be converted to RGBA on the GPU.
This commit is contained in:
jpark37
2019-08-11 11:26:22 -07:00
parent 31a902b3af
commit 3d6f5c8ad6
6 changed files with 344 additions and 11 deletions

View File

@@ -31,6 +31,7 @@ uniform float3 color_range_max = {1.0, 1.0, 1.0};
uniform texture2d image;
uniform texture2d image1;
uniform texture2d image2;
uniform texture2d image3;
sampler_state def_sampler {
Filter = Linear;
@@ -256,6 +257,19 @@ float3 PSPlanar420_Reverse(VertTexPos frag_in) : TARGET
return rgb;
}
float4 PSPlanar420A_Reverse(VertTexPos frag_in) : TARGET
{
int3 xy0_luma = int3(frag_in.pos.xy, 0);
float y = image.Load(xy0_luma).x;
int3 xy0_chroma = int3(frag_in.uv, 0);
float cb = image1.Load(xy0_chroma).x;
float cr = image2.Load(xy0_chroma).x;
float alpha = image3.Load(xy0_luma).x;
float3 yuv = float3(y, cb, cr);
float4 rgba = float4(YUV_to_RGB(yuv), alpha);
return rgba;
}
float3 PSPlanar422_Reverse(FragPosWide frag_in) : TARGET
{
float y = image.Load(int3(frag_in.pos_wide.xz, 0)).x;
@@ -267,6 +281,19 @@ float3 PSPlanar422_Reverse(FragPosWide frag_in) : TARGET
return rgb;
}
float4 PSPlanar422A_Reverse(FragPosWide frag_in) : TARGET
{
int3 xy0_luma = int3(frag_in.pos_wide.xz, 0);
float y = image.Load(xy0_luma).x;
int3 xy0_chroma = int3(frag_in.pos_wide.yz, 0);
float cb = image1.Load(xy0_chroma).x;
float cr = image2.Load(xy0_chroma).x;
float alpha = image3.Load(xy0_luma).x;
float3 yuv = float3(y, cb, cr);
float4 rgba = float4(YUV_to_RGB(yuv), alpha);
return rgba;
}
float3 PSPlanar444_Reverse(FragPos frag_in) : TARGET
{
int3 xy0 = int3(frag_in.pos.xy, 0);
@@ -278,6 +305,25 @@ float3 PSPlanar444_Reverse(FragPos frag_in) : TARGET
return rgb;
}
float4 PSPlanar444A_Reverse(FragPos frag_in) : TARGET
{
int3 xy0 = int3(frag_in.pos.xy, 0);
float y = image.Load(xy0).x;
float cb = image1.Load(xy0).x;
float cr = image2.Load(xy0).x;
float alpha = image3.Load(xy0).x;
float3 yuv = float3(y, cb, cr);
float4 rgba = float4(YUV_to_RGB(yuv), alpha);
return rgba;
}
float4 PSAYUV_Reverse(FragPos frag_in) : TARGET
{
float4 yuva = image.Load(int3(frag_in.pos.xy, 0));
float4 rgba = float4(YUV_to_RGB(yuva.xyz), yuva.a);
return rgba;
}
float3 PSNV12_Reverse(VertTexPos frag_in) : TARGET
{
float y = image.Load(int3(frag_in.pos.xy, 0)).x;
@@ -429,6 +475,15 @@ technique I420_Reverse
}
}
technique I40A_Reverse
{
pass
{
vertex_shader = VSTexPosHalfHalf_Reverse(id);
pixel_shader = PSPlanar420A_Reverse(frag_in);
}
}
technique I422_Reverse
{
pass
@@ -438,6 +493,15 @@ technique I422_Reverse
}
}
technique I42A_Reverse
{
pass
{
vertex_shader = VSPosWide_Reverse(id);
pixel_shader = PSPlanar422A_Reverse(frag_in);
}
}
technique I444_Reverse
{
pass
@@ -447,6 +511,24 @@ technique I444_Reverse
}
}
technique YUVA_Reverse
{
pass
{
vertex_shader = VSPos(id);
pixel_shader = PSPlanar444A_Reverse(frag_in);
}
}
technique AYUV_Reverse
{
pass
{
vertex_shader = VSPos(id);
pixel_shader = PSAYUV_Reverse(frag_in);
}
}
technique NV12_Reverse
{
pass