1 
2 module dglsl.sampler;
3 
4 import dglsl.type;
5 
6 struct Sampler1D(Type) { alias type = Type; }
7 struct Sampler2D(Type) { alias type = Type; }
8 struct Sampler3D(Type) { alias type = Type; }
9 struct SamplerCube(Type) { alias type = Type; }
10 struct Sampler2DRect(Type) { alias type = Type; }
11 struct Sampler1DShadow(Type) { alias type = Type; }
12 struct Sampler2DShadow(Type) { alias type = Type; }
13 struct SamplerCubeShadow(Type) { alias type = Type; }
14 struct Sampler2DRectShadow(Type) { alias type = Type; }
15 struct Sampler1DArray(Type) { alias type = Type; }
16 struct Sampler2DArray(Type) { alias type = Type; }
17 struct Sampler1DArrayShadow(Type) { alias type = Type; }
18 struct Sampler2DArrayShadow(Type) { alias type = Type; }
19 struct SamplerBuffer(Type) { alias type = Type; }
20 struct Sampler2DMS(Type) { alias type = Type; }
21 struct Sampler2DMSArray(Type) { alias type = Type; }
22 
23 alias sampler1D = Sampler1D!(float);
24 alias sampler2D = Sampler2D!(float);
25 alias sampler3D = Sampler3D!(float);
26 alias samplerCube = SamplerCube!(float);
27 alias sampler2DRect = Sampler2DRect!(float);
28 alias sampler1DShadow = Sampler1DShadow!(float);
29 alias sampler2DShadow = Sampler2DShadow!(float);
30 alias samplerCubeShadow = SamplerCubeShadow!(float);
31 alias sampler2DRectShadow = Sampler2DRectShadow!(float);
32 alias sampler1DArray = Sampler1DArray!(float);
33 alias sampler2DArray = Sampler2DArray!(float);
34 alias sampler1DArrayShadow = Sampler1DArrayShadow!(float);
35 alias sampler2DArrayShadow = Sampler2DArrayShadow!(float);
36 alias samplerBuffer = SamplerBuffer!(float);
37 alias sampler2DMS = Sampler2DMS!(float);
38 alias sampler2DMSArray = Sampler2DMSArray!(float);
39 
40 alias isampler1D = Sampler1D!(int);
41 alias isampler2D = Sampler2D!(int);
42 alias isampler3D = Sampler3D!(int);
43 alias isamplerCube = SamplerCube!(int);
44 alias isampler2DRect = Sampler2DRect!(int);
45 alias isampler1DArray = Sampler1DArray!(int);
46 alias isampler2DArray = Sampler2DArray!(int);
47 alias isamplerBuffer = SamplerBuffer!(int);
48 alias isampler2DMS = Sampler2DMS!(int);
49 alias isampler2DMSArray = Sampler2DMSArray!(int);
50 
51 alias usampler1D = Sampler1D!(uint);
52 alias usampler2D = Sampler2D!(uint);
53 alias usampler3D = Sampler3D!(uint);
54 alias usamplerCube = SamplerCube!(uint);
55 alias usampler2DRect = Sampler2DRect!(uint);
56 alias usampler1DArray = Sampler1DArray!(uint);
57 alias usampler2DArray = Sampler2DArray!(uint);
58 alias usamplerBuffer = SamplerBuffer!(uint);
59 alias usampler2DMS = Sampler2DMS!(uint);
60 alias usampler2DMSArray = Sampler2DMSArray!(uint);
61 
62 import std.string;
63 import std.algorithm;
64 import std.array;
65 string specialize(string source) {
66     return source.lineSplitter
67         .map!((l) {
68             if (l.canFind('g')) return l.replace("g", "") ~ "\n" ~ l.replace("g", "i") ~ "\n" ~ l.replace("g", "u");
69             else return l.strip;
70         })
71         .filter!(l => !l.empty)
72         .join("\n")
73         .lineSplitter
74         .map!(l => l.chomp(";") ~ ` { throw new Error(__FUNCTION__ ~ "is not implemented."); }`)
75         .join("\n");
76 }
77 
78 mixin template TextureLookupFunctions() {
79     mixin(q{
80         int textureSize(gsampler1D sampler, int lod);
81         ivec2 textureSize(gsampler2D sampler, int lod);
82         ivec3 textureSize(gsampler3D sampler, int lod);
83         ivec2 textureSize(gsamplerCube sampler, int lod);
84         int textureSize(sampler1DShadow sampler, int lod);
85         ivec2 textureSize(sampler2DShadow sampler, int lod);
86         ivec2 textureSize(samplerCubeShadow sampler, int lod);
87         ivec2 textureSize(gsampler2DRect sampler);
88         ivec2 textureSize(sampler2DRectShadow sampler);
89         ivec2 textureSize(gsampler1DArray sampler, int lod);
90         ivec3 textureSize(gsampler2DArray sampler, int lod);
91         ivec2 textureSize(sampler1DArrayShadow sampler, int lod);
92         ivec3 textureSize(sampler2DArrayShadow sampler, int lod);
93         int textureSize(gsamplerBuffer sampler);
94         ivec2 textureSize(gsampler2DMS sampler);
95         ivec2 textureSize(gsampler2DMSArray sampler);
96     }.specialize);    
97     mixin(q{
98         gvec4 texture(gsampler1D sampler, float P, float bias = float.nan);
99         gvec4 texture(gsampler2D sampler, vec2 P, float bias = float.nan);
100         gvec4 texture(gsampler3D sampler, vec3 P, float bias = float.nan);
101         gvec4 texture(gsamplerCube sampler, vec3 P, float bias = float.nan);
102         float texture(sampler1DShadow sampler, vec3 P, float bias = float.nan);
103         float texture(sampler2DShadow sampler, vec3 P, float bias = float.nan);
104         float texture(samplerCubeShadow sampler, vec4 P, float bias = float.nan);
105         gvec4 texture(gsampler1DArray sampler, vec2 P, float bias = float.nan);
106         gvec4 texture(gsampler2DArray sampler, vec3 P, float bias = float.nan);
107         float texture(sampler1DArrayShadow sampler, vec3 P, float bias = float.nan);
108         float texture(sampler2DArrayShadow sampler, vec4 P);
109         gvec4 texture(gsampler2DRect sampler, vec2 P);
110         float texture(sampler2DRectShadow sampler, vec3 P);
111     }.specialize);
112     mixin(q{
113         gvec4 textureProj(gsampler1D sampler, vec2 P, float bias = float.nan);
114         gvec4 textureProj(gsampler1D sampler, vec4 P, float bias = float.nan);
115         gvec4 textureProj(gsampler2D sampler, vec3 P, float bias = float.nan);
116         gvec4 textureProj(gsampler2D sampler, vec4 P, float bias = float.nan);
117         gvec4 textureProj(gsampler3D sampler, vec4 P, float bias = float.nan);
118         float textureProj(sampler1DShadow sampler, vec4 P, float bias = float.nan);
119         float textureProj(sampler2DShadow sampler, vec4 P, float bias = float.nan);
120         gvec4 textureProj(gsampler2DRect sampler, vec3 P);
121         gvec4 textureProj(gsampler2DRect sampler, vec4 P);
122         float textureProj(sampler2DRectShadow sampler, vec4 P);
123     }.specialize);
124     mixin(q{
125         gvec4 textureLod(gsampler1D sampler, float P, float lod);
126         gvec4 textureLod(gsampler2D sampler, vec2 P, float lod);
127         gvec4 textureLod(gsampler3D sampler, vec3 P, float lod);
128         gvec4 textureLod(gsamplerCube sampler, vec3 P, float lod);
129         float textureLod(sampler1DShadow sampler, vec3 P, float lod);
130         float textureLod(sampler2DShadow sampler, vec3 P, float lod);
131         gvec4 textureLod(gsampler1DArray sampler, vec2 P, float lod);
132         gvec4 textureLod(gsampler2DArray sampler, vec3 P, float lod);
133         float textureLod(sampler1DArrayShadow sampler, vec3 P, float lod);
134     }.specialize);
135     mixin(q{
136         gvec4 textureOffset(gsampler1D sampler, float P, int offset, float bias = float.nan);
137         gvec4 textureOffset(gsampler2D sampler, vec2 P, ivec2 offset, float bias = float.nan);
138         gvec4 textureOffset(gsampler3D sampler, vec3 P, ivec3 offset, float bias = float.nan);
139         gvec4 textureOffset(gsampler2DRect sampler, vec2 P, ivec2 offset);
140         float textureOffset(sampler2DRectShadow sampler, vec3 P, ivec2 offset);
141         float textureOffset(sampler1DShadow sampler, vec3 P, int offset, float bias = float.nan);
142         float textureOffset(sampler2DShadow sampler, vec3 P, ivec2 offset, float bias = float.nan);
143         gvec4 textureOffset(gsampler1DArray sampler, vec2 P, int offset, float bias = float.nan);
144         gvec4 textureOffset(gsampler2DArray sampler, vec3 P, ivec2 offset, float bias = float.nan);
145         float textureOffset(sampler1DArrayShadow sampler, vec3 P, int offset, float bias = float.nan);
146     }.specialize);
147     mixin(q{
148         gvec4 texelFetch(gsampler1D sampler, int P, int lod);
149         gvec4 texelFetch(gsampler2D sampler, ivec2 P, int lod);
150         gvec4 texelFetch(gsampler3D sampler, ivec3 P, int lod);
151         gvec4 texelFetch(gsampler2DRect sampler, ivec2 P);
152         gvec4 texelFetch(gsampler1DArray sampler, ivec2 P, int lod);
153         gvec4 texelFetch(gsampler2DArray sampler, ivec3 P, int lod);
154         gvec4 texelFetch(gsamplerBuffer sampler, int P);
155         gvec4 texelFetch(gsampler2DMS sampler, ivec2 P, int sample);
156         gvec4 texelFetch(gsampler2DMSArray sampler, ivec3 P, int sample);
157     }.specialize);
158     mixin(q{
159         gvec4 texelFetchOffset(gsampler1D sampler, int P, int lod, int offset);
160         gvec4 texelFetchOffset(gsampler2D sampler, ivec2 P, int lod, ivec2 offset);
161         gvec4 texelFetchOffset(gsampler3D sampler, ivec3 P, int lod, ivec3 offset);
162         gvec4 texelFetchOffset(gsampler2DRect sampler, ivec2 P, ivec2 offset);
163         gvec4 texelFetchOffset(gsampler1DArray sampler, ivec2 P, int lod, int offset);
164         gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod,ivec2 offset);
165     }.specialize);
166     mixin(q{
167         gvec4 textureProjOffset(gsampler1D sampler, vec2 P, int offset, float bias = float.nan);
168         gvec4 textureProjOffset(gsampler1D sampler, vec4 P, int offset, float bias = float.nan);
169         gvec4 textureProjOffset(gsampler2D sampler, vec3 P, ivec2 offset, float bias = float.nan);
170         gvec4 textureProjOffset(gsampler2D sampler, vec4 P, ivec2 offset, float bias = float.nan);
171         gvec4 textureProjOffset(gsampler3D sampler, vec4 P, ivec3 offset, float bias = float.nan);
172         gvec4 textureProjOffset(gsampler2DRect sampler, vec3 P, ivec2 offset);
173         gvec4 textureProjOffset(gsampler2DRect sampler, vec4 P, ivec2 offset);
174         float textureProjOffset(sampler2DRectShadow sampler, vec4 P, ivec2 offset);
175         float textureProjOffset(sampler1DShadow sampler, vec4 P, int offset, float bias = float.nan);
176         float textureProjOffset(sampler2DShadow sampler, vec4 P, ivec2 offset, float bias = float.nan);
177     }.specialize);
178     mixin(q{
179         gvec4 textureLodOffset(gsampler1D sampler, float P, float lod, int offset);
180         gvec4 textureLodOffset(gsampler2D sampler, vec2 P, float lod, ivec2 offset);
181         gvec4 textureLodOffset(gsampler3D sampler, vec3 P, float lod, ivec3 offset);
182         float textureLodOffset(sampler1DShadow sampler, vec3 P, float lod, int offset);
183         float textureLodOffset(sampler2DShadow sampler, vec3 P, float lod, ivec2 offset);
184         gvec4 textureLodOffset(gsampler1DArray sampler, vec2 P, float lod, int offset);
185         gvec4 textureLodOffset(gsampler2DArray sampler, vec3 P, float lod, ivec2 offset);
186         float textureLodOffset(sampler1DArrayShadow sampler, vec3 P, float lod, int offset);
187     }.specialize);
188     mixin(q{
189         gvec4 textureProjLod (gsampler1D sampler, vec2 P, float lod);
190         gvec4 textureProjLod (gsampler1D sampler, vec4 P, float lod);
191         gvec4 textureProjLod (gsampler2D sampler, vec3 P, float lod);
192         gvec4 textureProjLod (gsampler2D sampler, vec4 P, float lod);
193         gvec4 textureProjLod (gsampler3D sampler, vec4 P, float lod);
194         float textureProjLod (sampler1DShadow sampler, vec4 P, float lod);
195         float textureProjLod (sampler2DShadow sampler, vec4 P, float lod);
196     }.specialize);
197     mixin(q{
198         gvec4 textureProjLodOffset(gsampler1D sampler, vec2 P, float lod, int offset);
199         gvec4 textureProjLodOffset(gsampler1D sampler, vec4 P, float lod, int offset);
200         gvec4 textureProjLodOffset(gsampler2D sampler, vec3 P, float lod, ivec2 offset);
201         gvec4 textureProjLodOffset(gsampler2D sampler, vec4 P, float lod, ivec2 offset);
202         gvec4 textureProjLodOffset(gsampler3D sampler, vec4 P, float lod, ivec3 offset);
203         float textureProjLodOffset(sampler1DShadow sampler, vec4 P, float lod, int offset);
204         float textureProjLodOffset(sampler2DShadow sampler, vec4 P, float lod, ivec2 offset);
205     }.specialize);
206     mixin(q{
207         gvec4 textureGrad(gsampler1D sampler, float P, float dPdx, float dPdy);
208         gvec4 textureGrad(gsampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy);
209         gvec4 textureGrad(gsampler3D sampler, vec3 P, vec3 dPdx, vec3 dPdy);
210         gvec4 textureGrad(gsamplerCube sampler, vec3 P, vec3 dPdx, vec3 dPdy);
211         gvec4 textureGrad(gsampler2DRect sampler, vec2 P, vec2 dPdx, vec2 dPdy);
212         float textureGrad(sampler2DRectShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy);
213         float textureGrad(sampler1DShadow sampler, vec3 P, float dPdx, float dPdy);
214         float textureGrad(sampler2DShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy);
215         float textureGrad(samplerCubeShadow sampler, vec4 P, vec3 dPdx, vec3 dPdy);
216         gvec4 textureGrad(gsampler1DArray sampler, vec2 P, float dPdx, float dPdy);
217         gvec4 textureGrad(gsampler2DArray sampler, vec3 P, vec2 dPdx, vec2 dPdy);
218         float textureGrad(sampler1DArrayShadow sampler, vec3 P, float dPdx, float dPdy);
219         float textureGrad(sampler2DArrayShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
220     }.specialize);
221     mixin(q{
222         gvec4 textureGradOffset(gsampler1D sampler, float P, float dPdx, float dPdy, int offset);
223         gvec4 textureGradOffset(gsampler2D sampler, vec2 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
224         gvec4 textureGradOffset(gsampler3D sampler, vec3 P, vec3 dPdx, vec3 dPdy, ivec3 offset);
225         gvec4 textureGradOffset(gsampler2DRect sampler, vec2 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
226         float textureGradOffset(sampler2DRectShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
227         float textureGradOffset(sampler1DShadow sampler, vec3 P, float dPdx, float dPdy, int offset );
228         float textureGradOffset(sampler2DShadow sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
229         gvec4 textureGradOffset(gsampler1DArray sampler, vec2 P, float dPdx, float dPdy, int offset);
230         gvec4 textureGradOffset(gsampler2DArray sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
231         float textureGradOffset(sampler1DArrayShadow sampler, vec3 P, float dPdx, float dPdy, int offset);
232         float textureGradOffset(sampler2DArrayShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
233     }.specialize);
234     mixin(q{
235         gvec4 textureProjGrad(gsampler1D sampler, vec2 P, float dPdx, float dPdy);
236         gvec4 textureProjGrad(gsampler1D sampler, vec4 P, float dPdx, float dPdy);
237         gvec4 textureProjGrad(gsampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy);
238         gvec4 textureProjGrad(gsampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy);
239         gvec4 textureProjGrad(gsampler3D sampler, vec4 P, vec3 dPdx, vec3 dPdy);
240         gvec4 textureProjGrad(gsampler2DRect sampler, vec3 P, vec2 dPdx, vec2 dPdy);
241         gvec4 textureProjGrad(gsampler2DRect sampler, vec4 P, vec2 dPdx, vec2 dPdy);
242         float textureProjGrad(sampler2DRectShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
243         float textureProjGrad(sampler1DShadow sampler, vec4 P, float dPdx, float dPdy);
244         float textureProjGrad(sampler2DShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy);
245     }.specialize);
246     mixin(q{
247         gvec4 textureProjGradOffset(gsampler1D sampler, vec2 P, float dPdx, float dPdy, int offset);
248         gvec4 textureProjGradOffset(gsampler1D sampler, vec4 P, float dPdx, float dPdy, int offset);
249         gvec4 textureProjGradOffset(gsampler2D sampler, vec3 P, vec2 dPdx, vec2 dPdy, vec2 offset);
250         gvec4 textureProjGradOffset(gsampler2D sampler, vec4 P, vec2 dPdx, vec2 dPdy, vec2 offset);
251         gvec4 textureProjGradOffset(gsampler2DRect sampler, vec3 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
252         gvec4 textureProjGradOffset(gsampler2DRect sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
253         float textureProjGradOffset(sampler2DRectShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, ivec2 offset);
254         gvec4 textureProjGradOffset(gsampler3D sampler, vec4 P, vec3 dPdx, vec3 dPdy, vec3 offset);
255         float textureProjGradOffset(sampler1DShadow sampler, vec4 P, float dPdx, float dPdy, int offset);
256         float textureProjGradOffset(sampler2DShadow sampler, vec4 P, vec2 dPdx, vec2 dPdy, vec2 offset);
257     }.specialize);
258 }