nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 fetchFromGitHub,
5 cmake,
6 pkg-config,
7 cctools,
8 makeWrapper,
9 mesa,
10 python3,
11 runCommand,
12 vulkan-headers,
13 vulkan-loader,
14 vulkan-validation-layers,
15}:
16let
17 # From https://github.com/google/amber/blob/main/DEPS
18 glslang = fetchFromGitHub {
19 owner = "KhronosGroup";
20 repo = "glslang";
21 rev = "340bf88f3fdb4f4a25b7071cd2c1205035fc6eaa";
22 hash = "sha256-3h27yE6k4BgUAugQCkpUYO5aIHpK6Anyh90y3q+aYpM=";
23 };
24
25 lodepng = fetchFromGitHub {
26 owner = "lvandeve";
27 repo = "lodepng";
28 rev = "5601b8272a6850b7c5d693dd0c0e16da50be8d8d";
29 hash = "sha256-dD8QoyOoGov6VENFNTXWRmen4nYYleoZ8+4TpICNSpo=";
30 };
31
32 shaderc = fetchFromGitHub {
33 owner = "google";
34 repo = "shaderc";
35 rev = "690d259384193c90c01b52288e280b05a8481121";
36 hash = "sha256-p4tP/8lRy0tpdDHIuh2/tWPIBBr2ludFRSr+Q2TbUic=";
37 };
38
39 spirv-headers = fetchFromGitHub {
40 owner = "KhronosGroup";
41 repo = "SPIRV-Headers";
42 rev = "3f17b2af6784bfa2c5aa5dbb8e0e74a607dd8b3b";
43 hash = "sha256-MCQ+i9ymjnxRZP/Agk7rOGdHcB4p67jT4J4athWUlcI=";
44 };
45
46 spirv-tools = fetchFromGitHub {
47 owner = "KhronosGroup";
48 repo = "SPIRV-Tools";
49 rev = "13b59bf1d84054b8ccd29cdc6b1303f69e8f9e77";
50 hash = "sha256-k/mTHiLbZdnslC24fjcrzqsZYMyVaAADGEqngqJcC2c=";
51 };
52
53in
54stdenv.mkDerivation (finalAttrs: {
55 pname = "amber";
56 version = "0-unstable-2025-02-03";
57
58 src = fetchFromGitHub {
59 owner = "google";
60 repo = "amber";
61 rev = "3f078e41d86ca1a5881560f00e26198f59bb8ac0";
62 hash = "sha256-pAotVFmtEGp9GKmDD0vrbfbO+Xt2URmM8gYCjl0LEnk=";
63 };
64
65 buildInputs = [
66 vulkan-headers
67 vulkan-loader
68 ];
69
70 nativeBuildInputs = [
71 cmake
72 makeWrapper
73 pkg-config
74 python3
75 ]
76 ++ lib.optionals stdenv.hostPlatform.isDarwin [
77 cctools
78 ];
79
80 # Tests are disabled so we do not have to pull in googletest and more dependencies
81 cmakeFlags = [
82 "-DAMBER_SKIP_TESTS=ON"
83 "-DAMBER_DISABLE_WERROR=ON"
84 ];
85
86 prePatch = ''
87 cp -r ${glslang}/ third_party/glslang
88 cp -r ${lodepng}/ third_party/lodepng
89 cp -r ${shaderc}/ third_party/shaderc
90 cp -r ${spirv-tools}/ third_party/spirv-tools
91 cp -r ${spirv-headers}/ third_party/spirv-headers
92 chmod u+w -R third_party
93
94 substituteInPlace tools/update_build_version.py \
95 --replace "not os.path.exists(directory)" "True"
96 '';
97
98 installPhase = ''
99 install -Dm755 -t $out/bin amber image_diff
100 wrapProgram $out/bin/amber \
101 --suffix VK_LAYER_PATH : ${vulkan-validation-layers}/share/vulkan/explicit_layer.d
102 '';
103
104 passthru.tests.lavapipe =
105 runCommand "vulkan-cts-tests-lavapipe"
106 {
107 nativeBuildInputs = [
108 finalAttrs.finalPackage
109 mesa.llvmpipeHook
110 ];
111 }
112 ''
113 cat > test.amber <<EOF
114 #!amber
115 # Simple amber compute shader.
116
117 SHADER compute kComputeShader GLSL
118 #version 450
119
120 layout(binding = 3) buffer block {
121 uvec2 values[];
122 };
123
124 void main() {
125 values[gl_WorkGroupID.x + gl_WorkGroupID.y * gl_NumWorkGroups.x] =
126 gl_WorkGroupID.xy;
127 }
128 END # shader
129
130 BUFFER kComputeBuffer DATA_TYPE vec2<int32> SIZE 524288 FILL 0
131
132 PIPELINE compute kComputePipeline
133 ATTACH kComputeShader
134 BIND BUFFER kComputeBuffer AS storage DESCRIPTOR_SET 0 BINDING 3
135 END # pipeline
136
137 RUN kComputePipeline 256 256 1
138
139 # Four corners
140 EXPECT kComputeBuffer IDX 0 EQ 0 0
141 EXPECT kComputeBuffer IDX 2040 EQ 255 0
142 EXPECT kComputeBuffer IDX 522240 EQ 0 255
143 EXPECT kComputeBuffer IDX 524280 EQ 255 255
144
145 # Center
146 EXPECT kComputeBuffer IDX 263168 EQ 128 128
147 EOF
148
149 amber test.amber
150 touch $out
151 '';
152
153 meta = {
154 description = "Multi-API shader test framework";
155 homepage = "https://github.com/google/amber";
156 license = lib.licenses.asl20;
157 maintainers = with lib.maintainers; [ Flakebi ];
158 };
159})