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 }