mirror of
https://github.com/zed-industries/zed.git
synced 2024-10-24 23:47:05 +00:00
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:
commit
a949959a42
1 changed files with 42 additions and 18 deletions
|
@ -34,7 +34,15 @@ float blur_along_x(float x, float y, float sigma, float corner, float2 halfSize)
|
||||||
|
|
||||||
struct QuadFragmentInput {
|
struct QuadFragmentInput {
|
||||||
float4 position [[position]];
|
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(
|
vertex QuadFragmentInput quad_vertex(
|
||||||
|
@ -51,35 +59,43 @@ vertex QuadFragmentInput quad_vertex(
|
||||||
|
|
||||||
return QuadFragmentInput {
|
return QuadFragmentInput {
|
||||||
device_position,
|
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(
|
fragment float4 quad_fragment(
|
||||||
QuadFragmentInput input [[stage_in]]
|
QuadFragmentInput input [[stage_in]]
|
||||||
) {
|
) {
|
||||||
float2 half_size = input.quad.size / 2.;
|
float2 half_size = input.size / 2.;
|
||||||
float2 center = input.quad.origin + half_size;
|
float2 center = input.origin + half_size;
|
||||||
float2 center_to_point = input.position.xy - center;
|
float2 center_to_point = input.position.xy - center;
|
||||||
float2 edge_to_point = abs(center_to_point) - half_size;
|
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;
|
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.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.corner_radius;
|
||||||
|
|
||||||
float border_width = 0.;
|
float border_width = 0.;
|
||||||
if (edge_to_point.x > edge_to_point.y) {
|
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 {
|
} 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;
|
float4 color;
|
||||||
if (border_width == 0.) {
|
if (border_width == 0.) {
|
||||||
color = coloru_to_colorf(input.quad.background_color);
|
color = coloru_to_colorf(input.background_color);
|
||||||
} else {
|
} else {
|
||||||
float inset_distance = distance + border_width;
|
float inset_distance = distance + border_width;
|
||||||
color = mix(
|
color = mix(
|
||||||
coloru_to_colorf(input.quad.border_color),
|
coloru_to_colorf(input.border_color),
|
||||||
coloru_to_colorf(input.quad.background_color),
|
coloru_to_colorf(input.background_color),
|
||||||
saturate(0.5 - inset_distance)
|
saturate(0.5 - inset_distance)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -90,7 +106,11 @@ fragment float4 quad_fragment(
|
||||||
|
|
||||||
struct ShadowFragmentInput {
|
struct ShadowFragmentInput {
|
||||||
float4 position [[position]];
|
float4 position [[position]];
|
||||||
GPUIShadow shadow;
|
vector_float2 origin;
|
||||||
|
vector_float2 size;
|
||||||
|
float corner_radius;
|
||||||
|
float sigma;
|
||||||
|
vector_uchar4 color;
|
||||||
};
|
};
|
||||||
|
|
||||||
vertex ShadowFragmentInput shadow_vertex(
|
vertex ShadowFragmentInput shadow_vertex(
|
||||||
|
@ -109,17 +129,21 @@ vertex ShadowFragmentInput shadow_vertex(
|
||||||
|
|
||||||
return ShadowFragmentInput {
|
return ShadowFragmentInput {
|
||||||
device_position,
|
device_position,
|
||||||
shadow,
|
shadow.origin,
|
||||||
|
shadow.size,
|
||||||
|
shadow.corner_radius,
|
||||||
|
shadow.sigma,
|
||||||
|
shadow.color,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment float4 shadow_fragment(
|
fragment float4 shadow_fragment(
|
||||||
ShadowFragmentInput input [[stage_in]]
|
ShadowFragmentInput input [[stage_in]]
|
||||||
) {
|
) {
|
||||||
float sigma = input.shadow.sigma;
|
float sigma = input.sigma;
|
||||||
float corner_radius = input.shadow.corner_radius;
|
float corner_radius = input.corner_radius;
|
||||||
float2 half_size = input.shadow.size / 2.;
|
float2 half_size = input.size / 2.;
|
||||||
float2 center = input.shadow.origin + half_size;
|
float2 center = input.origin + half_size;
|
||||||
float2 point = input.position.xy - center;
|
float2 point = input.position.xy - center;
|
||||||
|
|
||||||
// The signal is only non-zero in a limited range, so don't waste samples
|
// 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;
|
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 {
|
struct SpriteFragmentInput {
|
||||||
|
|
Loading…
Reference in a new issue