summaryrefslogtreecommitdiff
path: root/mm/assets/custom/shaders/metal/default.shader.metal
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2026-07-23 11:13:17 -0500
committerGitHub <noreply@github.com>2026-07-23 11:13:17 -0500
commit6eeeae0340a9eb549ec9a250731a91d7aff2a073 (patch)
tree1279109f0ca10052f5832730fb9365b51e4c1555 /mm/assets/custom/shaders/metal/default.shader.metal
parent2e733f5e178f9587acb70efcf20da2c9e6cace31 (diff)
Sync shaders from LUS (#1804)
Diffstat (limited to 'mm/assets/custom/shaders/metal/default.shader.metal')
-rw-r--r--mm/assets/custom/shaders/metal/default.shader.metal65
1 files changed, 43 insertions, 22 deletions
diff --git a/mm/assets/custom/shaders/metal/default.shader.metal b/mm/assets/custom/shaders/metal/default.shader.metal
index a771ba10c..bf876398e 100644
--- a/mm/assets/custom/shaders/metal/default.shader.metal
+++ b/mm/assets/custom/shaders/metal/default.shader.metal
@@ -9,6 +9,20 @@ struct FrameUniforms {
float noiseScale;
};
+struct DrawUniforms {
+ int textureFiltering[6];
+ @if(o_prim_depth)
+ float prim_depth;
+ @end
+};
+
+struct FragOut {
+ float4 color [[color(0)]];
+ @if(o_prim_depth)
+ float depth [[depth(any)]];
+ @end
+};
+
struct Vertex {
float4 position [[attribute(@{get_vertex_index()})]];
@{update_floats(4)}
@@ -123,31 +137,33 @@ float4 mod(float4 a, float4 b) {
#define WRAP(x, low, high) mod((x)-(low), (high)-(low)) + (low)
#define TEX_OFFSET(tex, texSmplr, texCoord, off, texSize) tex.sample(texSmplr, texCoord - off / texSize)
-@if(o_three_point_filtering)
- float4 filter3point(thread const texture2d<float> tex, thread const sampler texSmplr, thread const float2& texCoord, thread const float2& texSize) {
- float2 offset = fract((texCoord * texSize) - float2(0.5));
- offset -= float2(step(1.0, offset.x + offset.y));
- float4 c0 = TEX_OFFSET(tex, texSmplr, texCoord, offset, texSize);
- float4 c1 = TEX_OFFSET(tex, texSmplr, texCoord, float2(offset.x - sign(offset.x), offset.y), texSize);
- float4 c2 = TEX_OFFSET(tex, texSmplr, texCoord, float2(offset.x, offset.y - sign(offset.y)), texSize);
- return c0 + abs(offset.x) * (c1 - c0) + abs(offset.y) * (c2 - c0);
- }
+float4 filter3point(thread const texture2d<float> tex, thread const sampler texSmplr, thread const float2& texCoord, thread const float2& texSize) {
+ float2 offset = fract((texCoord * texSize) - float2(0.5));
+ offset -= float2(step(1.0, offset.x + offset.y));
+ float4 c0 = TEX_OFFSET(tex, texSmplr, texCoord, offset, texSize);
+ float4 c1 = TEX_OFFSET(tex, texSmplr, texCoord, float2(offset.x - sign(offset.x), offset.y), texSize);
+ float4 c2 = TEX_OFFSET(tex, texSmplr, texCoord, float2(offset.x, offset.y - sign(offset.y)), texSize);
+ return c0 + abs(offset.x) * (c1 - c0) + abs(offset.y) * (c2 - c0);
+}
- float4 hookTexture2D(thread const texture2d<float> tex, thread const sampler texSmplr, thread const float2& uv, thread const float2& texSize) {
+float4 hookTexture2D(thread const texture2d<float> tex, thread const sampler texSmplr, thread const float2& uv, thread const float2& texSize, thread const int filtering) {
+@if(o_three_point_filtering)
+ if(filtering == @{FILTER_THREE_POINT}) {
return filter3point(tex, texSmplr, uv, texSize);
}
-@else
- float4 hookTexture2D(thread const texture2d<float> tex, thread const sampler texSmplr, thread const float2& uv, thread const float2& texSize) {
- return tex.sample(texSmplr, uv);
- }
@end
+ return tex.sample(texSmplr, uv);
+}
float random(float3 value) {
float random = dot(sin(value), float3(12.9898, 78.233, 37.719));
return fract(sin(random) * 143758.5453);
}
-fragment float4 fragmentShader(ProjectedVertex in [[stage_in]], constant FrameUniforms &frameUniforms [[buffer(0)]]
+fragment FragOut fragmentShader(
+ ProjectedVertex in [[stage_in]],
+ constant FrameUniforms &frameUniforms [[buffer(0)]],
+ constant DrawUniforms &drawUniforms [[buffer(1)]]
@if(o_textures[0])
, texture2d<float> uTex0 [[texture(0)]], sampler uTex0Smplr [[sampler(0)]]
@end
@@ -184,13 +200,13 @@ fragment float4 fragmentShader(ProjectedVertex in [[stage_in]], constant FrameUn
@end
@end
- float4 texVal@{i} = hookTexture2D(uTex@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, texSize@{i});
+ float4 texVal@{i} = hookTexture2D(uTex@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, texSize@{i}, drawUniforms.textureFiltering[@{i}]);
@if(o_masks[i])
float2 maskSize@{i} = float2(uTexMask@{i}.get_width(), uTexMask@{i}.get_height());
- float4 maskVal@{i} = hookTexture2D(uTexMask@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, maskSize@{i});
+ float4 maskVal@{i} = hookTexture2D(uTexMask@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, maskSize@{i}, drawUniforms.textureFiltering[@{i}]);
@if(o_blend[i])
- float4 blendVal@{i} = hookTexture2D(uTexBlend@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, texSize@{i});
+ float4 blendVal@{i} = hookTexture2D(uTexBlend@{i}, uTex@{i}Smplr, vTexCoordAdj@{i}, texSize@{i}, drawUniforms.textureFiltering[@{i}]);
@else
float4 blendVal@{i} = float4(0, 0, 0, 0);
@end
@@ -266,10 +282,11 @@ fragment float4 fragmentShader(ProjectedVertex in [[stage_in]], constant FrameUn
@end
@if(o_alpha && o_noise)
- float2 coords = screenSpace.xy * noise_scale;
- texel.w *= round(saturate(random(float3(floor(coords), noise_frame)) + texel.w - 0.5));
+ float2 coords = in.position.xy * frameUniforms.noiseScale;
+ texel.w *= round(saturate(random(float3(floor(coords), float(frameUniforms.frameCount))) + texel.w - 0.5));
@end
+ FragOut out;
@if(o_alpha)
@if(o_alpha_threshold)
if (texel.w < 8.0 / 256.0) discard_fragment();
@@ -277,8 +294,12 @@ fragment float4 fragmentShader(ProjectedVertex in [[stage_in]], constant FrameUn
@if(o_invisible)
texel.w = 0.0;
@end
- return texel;
+ out.color = texel;
@else
- return float4(texel, 1.0);
+ out.color = float4(texel, 1.0);
+ @end
+ @if(o_prim_depth)
+ out.depth = drawUniforms.prim_depth;
@end
+ return out;
} \ No newline at end of file