From 26f689f5710530a86d3321524fa2ea5417ccab73 Mon Sep 17 00:00:00 2001 From: Ben Boyter Date: Mon, 18 Nov 2024 14:23:44 +1100 Subject: [PATCH] Add metal language supporty (#562) --- LANGUAGES.md | 1 + SCC-OUTPUT-REPORT.html | 46 ++-- examples/language/metal.metal | 401 ++++++++++++++++++++++++++++++++++ languages.json | 27 +++ processor/constants.go | 2 +- test-all.sh | 1 + 6 files changed, 454 insertions(+), 24 deletions(-) create mode 100644 examples/language/metal.metal diff --git a/LANGUAGES.md b/LANGUAGES.md index 99c1c480..eaea60a0 100644 --- a/LANGUAGES.md +++ b/LANGUAGES.md @@ -181,6 +181,7 @@ MATLAB (m) Max (maxpat) MDX (mdx) Meson (meson.build,meson_options.txt) +Metal (metal) Modula3 (m3,mg,ig,i3) Module-Definition (def) Monkey C (mc) diff --git a/SCC-OUTPUT-REPORT.html b/SCC-OUTPUT-REPORT.html index e50ae31e..d0edab02 100644 --- a/SCC-OUTPUT-REPORT.html +++ b/SCC-OUTPUT-REPORT.html @@ -18,7 +18,7 @@ 447 7674 1413 - 255540 + 255608 4127 processor/workers_test.go @@ -130,16 +130,6 @@ 37 4585 97 - - processor/structs.go - - 199 - 21 - 18 - 160 - 17 - 5883 - 139 cmd/badges/main_test.go @@ -150,6 +140,16 @@ 10 4088 106 + + processor/structs.go + + 199 + 21 + 18 + 160 + 17 + 5883 + 139 processor/workers_regression_test.go @@ -240,16 +240,6 @@ 0 2209 35 - - processor/cocomo_test.go - - 37 - 8 - 4 - 25 - 6 - 686 - 23 processor/bloom.go @@ -260,6 +250,16 @@ 2 1062 29 + + processor/cocomo_test.go + + 37 + 8 + 4 + 25 + 6 + 686 + 23 processor/helpers_test.go @@ -288,7 +288,7 @@ 1 4 0 - 22967 + 23035 6 @@ -299,7 +299,7 @@ 447 7674 1413 - 255540 + 255608 4127 diff --git a/examples/language/metal.metal b/examples/language/metal.metal new file mode 100644 index 00000000..43629f91 --- /dev/null +++ b/examples/language/metal.metal @@ -0,0 +1,401 @@ +/* + + Copyright (C) 2016 Apple Inc. All Rights Reserved. + + See LICENSE.txt for this sample’s licensing information + + + + Abstract: + + A shader using random noise to create a wood texture for the Metal Shader Showcase. This is an example of a 3D procedural texture based shader. The wood texture is accomplished by making rings of two different colors and using perlin noise to add some variation to the rings. + + */ + + + +#include + +#include + +#include + +#include "AAPLSharedTypes.h" + + + +using namespace metal; + + + + + +struct ColorInOut { + + float4 position [[position]]; + + float3 normal_cameraspace; + + float3 eye_direction_cameraspace; + + float3 light_direction_cameraspace; + + float3 position_modelspace; + + float3 position_cameraspace; + +}; + + + +float rand(int x, int y, int z); + +float smoothNoise(float x, float y, float z); + +float noise3D(float unscaledX, float unscaledY, float unscaledZ); + +float3 woodColor(float3 position); + + + +// Global constants + +constant float3 light_position = float3(-1.0, 1.0, -1.0); + +constant float4 light_color = float4(1.0, 1.0, 1.0, 1.0); + +constant float teapotMin = -0.144000; + +constant float teapotMax = 0.164622; + +constant float scaleLength = teapotMax - teapotMin; + +constant uint NOISE_DIM = 512; + +constant float NOISE_SIZE = 64; + +constant float3 darkBrown = float3(0.234f, 0.125f, 0.109f); + +constant float3 lightBrown = float3(0.168f, 0.133f, 0.043f); + +constant float numberOfRings = 84.0; + +constant float turbulence = 0.015; + +constant float PI = 3.14159; + +constant float materialShine = 50.0; + + + + + +// Generate a random float in the range [0.0f, 1.0f] using x, y, and z (based on the xor128 algorithm) + +float rand(int x, int y, int z) + +{ + + int seed = x + y * 57 + z * 241; + + seed= (seed<< 13) ^ seed; + + return (( 1.0 - ( (seed * (seed * seed * 15731 + 789221) + 1376312589) & 2147483647) / 1073741824.0f) + 1.0f) / 2.0f; + +} + + + +// Return the interpolated noise for the given x, y, and z values. This is done by finding the whole + +// number before and after the given position in each dimension. Using these values we can get 6 vertices + +// that represent a cube that surrounds the position. We get each of the vertices noise values, and using the + +// given position, interpolate between the noise values of the vertices to get the smooth noise. + +float smoothNoise(float x, float y, float z) + +{ + + // Get the truncated x, y, and z values + + int intX = x; + + int intY = y; + + int intZ = z; + + + + // Get the fractional reaminder of x, y, and z + + float fractX = x - intX; + + float fractY = y - intY; + + float fractZ = z - intZ; + + + + // Get first whole number before + + int x1 = (intX + NOISE_DIM) % NOISE_DIM; + + int y1 = (intY + NOISE_DIM) % NOISE_DIM; + + int z1 = (intZ + NOISE_DIM) % NOISE_DIM; + + + + // Get the number after + + int x2 = (x1 + NOISE_DIM - 1) % NOISE_DIM; + + int y2 = (y1 + NOISE_DIM - 1) % NOISE_DIM; + + int z2 = (z1 + NOISE_DIM - 1) % NOISE_DIM; + + + + // Tri-linearly interpolate the noise + + float sumY1Z1 = mix(rand(x2,y1,z1), rand(x1,y1,z1), fractX); + + float sumY1Z2 = mix(rand(x2,y1,z2), rand(x1,y1,z2), fractX); + + float sumY2Z1 = mix(rand(x2,y2,z1), rand(x1,y2,z1), fractX); + + float sumY2Z2 = mix(rand(x2,y2,z2), rand(x1,y2,z2), fractX); + + + + float sumZ1 = mix(sumY2Z1, sumY1Z1, fractY); + + float sumZ2 = mix(sumY2Z2, sumY1Z2, fractY); + + + + float value = mix(sumZ2, sumZ1, fractZ); + + + + return value; + +} + + + +// Generate perlin noise for the given input values. This is done by generating smooth noise at mutiple + +// different sizes and adding them together. + +float noise3D(float unscaledX, float unscaledY, float unscaledZ) + +{ + + // Scale the values to force them in the range [0, NOISE_DIM] + + float x = ((unscaledX - teapotMin) / scaleLength) * NOISE_DIM; + + float y = ((unscaledY - teapotMin) / scaleLength) * NOISE_DIM; + + float z = ((unscaledZ - teapotMin) / scaleLength) * NOISE_DIM; + + + + float value = 0.0f, size = NOISE_SIZE, div = 0.0; + + + + //Add together smooth noise of increasingly smaller size. + + while(size >= 1.0f) + + { + + value += smoothNoise(x / size, y / size, z / size) * size; + + div += size; + + size /= 2.0f; + + } + + value /= div; + + + + return value; + +} + + + +// Calculate the wood color given the position + +float3 woodColor(float3 position) + +{ + + float x = position.x, y = position.y, z = position.z; + + + + // Get the distance of the point from the y-axis to identify whether it will be a ring or not. + + // Get the smooth value for that point to add some randomness to the rings and scale the + + // randomness by a factor called turbulence. Use the cosine function to make the rings and + + // interpolate between the two wood ring colors. + + float distanceValue = sqrt(x*x + z*z) + turbulence * noise3D(x, y, z); + + float cosineValue = fabs(cos(2.0f * numberOfRings * distanceValue * PI)); + + + + float3 finalColor = darkBrown + cosineValue * lightBrown; + + return finalColor; + +} + + + +// Wood vertex shader function + +vertex ColorInOut wood_vertex(device packed_float3* vertices [[ buffer(0) ]], + + device packed_float3* normals [[ buffer(1) ]], + + constant AAPL::uniforms_t& uniforms [[ buffer(2) ]], + + unsigned int vid [[ vertex_id ]]) + +{ + + ColorInOut out; + + + + float4x4 model_matrix = uniforms.model_matrix; + + float4x4 view_matrix = uniforms.view_matrix; + + float4x4 projection_matrix = uniforms.projection_matrix; + + float4x4 mvp_matrix = projection_matrix * view_matrix * model_matrix; + + float4x4 model_view_matrix = view_matrix * model_matrix; + + + + // Calculate the position of the object from the perspective of the camera + + float4 vertex_position_modelspace = float4(float3(vertices[vid]), 1.0f); + + out.position = mvp_matrix * vertex_position_modelspace; + + out.position_modelspace = vertices[vid]; + + + + // Calculate the normal from the perspective of the camera + + float3 normal = normals[vid]; + + out.normal_cameraspace = (normalize(model_view_matrix * float4(normal, 0.0f))).xyz; + + + + // Calculate the view vector from the perspective of the camera + + float3 vertex_position_cameraspace = ( view_matrix * model_matrix * vertex_position_modelspace ).xyz; + + out.eye_direction_cameraspace = float3(0.0f,0.0f,0.0f) - vertex_position_cameraspace; + + + + // Calculate the direction of the light from the position of the camera + + float3 light_position_cameraspace = ( view_matrix * float4(light_position,1.0f)).xyz; + + out.light_direction_cameraspace = light_position_cameraspace + out.eye_direction_cameraspace; + + + + return out; + +} + + + +// Wood fragment shader function + +fragment half4 wood_fragment(ColorInOut in [[stage_in]]) + +{ + + half4 color(1.0f); + + + + // Get the woods base color using the woodColor function + + float3 baseColor = woodColor(in.position_modelspace); + + + + // Generate material ambient, difuse, and specular colors derived from the base color of the wood + + float3 material_ambient_color = 0.5f * baseColor; + + float3 material_diffuse_color = baseColor; + + float3 material_specular_color = float3(0.4f); + + + + // Calculate the ambient color + + float3 ambient_component = material_ambient_color; + + + + // Calculate the diffuse color + + float3 n = normalize(in.normal_cameraspace); + + float3 l = normalize(in.light_direction_cameraspace); + + float n_dot_l = saturate( dot(n, l) ); + + + + float3 diffuse_component = light_color.xyz * n_dot_l * material_diffuse_color; + + + + // Calculate the specular color + + float3 e = normalize(in.eye_direction_cameraspace); + + float3 r = -l + 2.0f * n_dot_l * n; + + float e_dot_r = saturate( dot(e, r) ); + + float3 specular_component = material_specular_color * light_color.xyz * pow(e_dot_r, materialShine); + + + + // Combine the ambient, specular and diffuse colors to get the final color + + color.rgb = half3(ambient_component + diffuse_component + specular_component); + + + + return color; + +}; \ No newline at end of file diff --git a/languages.json b/languages.json index 0808af9f..5806cc8b 100644 --- a/languages.json +++ b/languages.json @@ -3982,6 +3982,33 @@ "multi_line": [], "quotes": [] }, + "Metal": { + "complexitychecks": [ + "for ", + "for(", + "if ", + "if(", + "switch ", + "switch(", + "while ", + "while(", + "else ", + "|| ", + "&& ", + "!= ", + "== " + ], + "extensions": ["metal"], + "line_comment": ["//"], + "multi_line": [["/*", "*/"]], + "quotes": [ + { + "end": "\"", + "start": "\"" + } + ] + }, + "Meson": { "complexitychecks": [ "foreach ", diff --git a/processor/constants.go b/processor/constants.go index 37ac1170..b9cd3115 100644 --- a/processor/constants.go +++ b/processor/constants.go @@ -2,5 +2,5 @@ package processor const ( - languages = `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` + languages = `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` ) diff --git a/test-all.sh b/test-all.sh index dadbeb64..2c0befba 100755 --- a/test-all.sh +++ b/test-all.sh @@ -971,6 +971,7 @@ specificLanguages=( 'LLVM IR ' 'Luna ' 'Makefile ' + 'Metal ' 'Monkey C ' 'Moonbit ' 'Nushell '