Merge pull request #1 from zed-industries/catalina-mps-compatibility

Avoid nested structs in the types used to pass data from vertex to fragment shader functions
This commit is contained in:
Antonio Scandurra 2021-03-29 09:16:15 +02:00 committed by GitHub
commit a949959a42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -34,7 +34,15 @@ float blur_along_x(float x, float y, float sigma, float corner, float2 halfSize)
struct QuadFragmentInput {
float4 position [[position]];
GPUIQuad quad;
vector_float2 origin;
vector_float2 size;
vector_uchar4 background_color;
float border_top;
float border_right;
float border_bottom;
float border_left;
vector_uchar4 border_color;
float corner_radius;
};
vertex QuadFragmentInput quad_vertex(
@ -51,35 +59,43 @@ vertex QuadFragmentInput quad_vertex(
return QuadFragmentInput {
device_position,
quad,
quad.origin,
quad.size,
quad.background_color,
quad.border_top,
quad.border_right,
quad.border_bottom,
quad.border_left,
quad.border_color,
quad.corner_radius,
};
}
fragment float4 quad_fragment(
QuadFragmentInput input [[stage_in]]
) {
float2 half_size = input.quad.size / 2.;
float2 center = input.quad.origin + half_size;
float2 half_size = input.size / 2.;
float2 center = input.origin + half_size;
float2 center_to_point = input.position.xy - center;
float2 edge_to_point = abs(center_to_point) - half_size;
float2 rounded_edge_to_point = abs(center_to_point) - half_size + input.quad.corner_radius;
float distance = length(max(0., rounded_edge_to_point)) + min(0., max(rounded_edge_to_point.x, rounded_edge_to_point.y)) - input.quad.corner_radius;
float2 rounded_edge_to_point = abs(center_to_point) - half_size + input.corner_radius;
float distance = length(max(0., rounded_edge_to_point)) + min(0., max(rounded_edge_to_point.x, rounded_edge_to_point.y)) - input.corner_radius;
float border_width = 0.;
if (edge_to_point.x > edge_to_point.y) {
border_width = center_to_point.x <= 0. ? input.quad.border_left : input.quad.border_right;
border_width = center_to_point.x <= 0. ? input.border_left : input.border_right;
} else {
border_width = center_to_point.y <= 0. ? input.quad.border_top : input.quad.border_bottom;
border_width = center_to_point.y <= 0. ? input.border_top : input.border_bottom;
}
float4 color;
if (border_width == 0.) {
color = coloru_to_colorf(input.quad.background_color);
color = coloru_to_colorf(input.background_color);
} else {
float inset_distance = distance + border_width;
color = mix(
coloru_to_colorf(input.quad.border_color),
coloru_to_colorf(input.quad.background_color),
coloru_to_colorf(input.border_color),
coloru_to_colorf(input.background_color),
saturate(0.5 - inset_distance)
);
}
@ -90,7 +106,11 @@ fragment float4 quad_fragment(
struct ShadowFragmentInput {
float4 position [[position]];
GPUIShadow shadow;
vector_float2 origin;
vector_float2 size;
float corner_radius;
float sigma;
vector_uchar4 color;
};
vertex ShadowFragmentInput shadow_vertex(
@ -109,17 +129,21 @@ vertex ShadowFragmentInput shadow_vertex(
return ShadowFragmentInput {
device_position,
shadow,
shadow.origin,
shadow.size,
shadow.corner_radius,
shadow.sigma,
shadow.color,
};
}
fragment float4 shadow_fragment(
ShadowFragmentInput input [[stage_in]]
) {
float sigma = input.shadow.sigma;
float corner_radius = input.shadow.corner_radius;
float2 half_size = input.shadow.size / 2.;
float2 center = input.shadow.origin + half_size;
float sigma = input.sigma;
float corner_radius = input.corner_radius;
float2 half_size = input.size / 2.;
float2 center = input.origin + half_size;
float2 point = input.position.xy - center;
// The signal is only non-zero in a limited range, so don't waste samples
@ -137,7 +161,7 @@ fragment float4 shadow_fragment(
y += step;
}
return float4(1., 1., 1., alpha) * coloru_to_colorf(input.shadow.color);
return float4(1., 1., 1., alpha) * coloru_to_colorf(input.color);
}
struct SpriteFragmentInput {