private string GetShaderHeader(FilterLoader.Type kernel, IShaderBuilder builder) { string filterDirectionVar = parent.IsSepa ? "int3 filterDirection;" : ""; return($@" {builder.UavType} dst_image : register(u0); {builder.SrvSingleType} src_image : register(t0); {builder.SrvType} src_image_ex : register(t1); SamplerState linearSampler : register(s0); SamplerState pointSampler : register(s1); cbuffer LayerLevelBuffer : register(b0) {{ uint layer; uint level; uint2 LayerLevelBuffer_padding_; {filterDirectionVar} }}; // texel helper function #if {builder.Is3DInt} int3 texel(int3 coord) {{ return coord; }} int3 texel(int3 coord, int layer) {{ return coord; }} #else int2 texel(int3 coord) {{ return coord.xy; }} int3 texel(int3 coord, int layer) {{ return int3(coord.xy, layer); }} #endif float4 filter{GetKernelDeclaration(kernel)}; [numthreads({localSize}, {localSize}, {(builder.Is3D?localSize:1)})] void main(uint3 coord : SV_DISPATCHTHREADID) {{ uint width, height, depth; dst_image.GetDimensions(width, height, depth); uint3 dstCoord = coord; uint3 size = int3(width, height, depth); if(coord.x >= width || coord.y >= height) return; #if {builder.Is3DInt} if(coord.z >= depth) return; #else dstCoord.z = layer; size.z = 1; #endif #if {(kernel == FilterLoader.Type.Tex2D?1:0)} dst_image[dstCoord] = filter(coord.xy, size.xy); #elif {(kernel == FilterLoader.Type.Color ? 1 : 0)} dst_image[dstCoord] = filter(src_image[texel(coord)]); #else // dynamic or 3D dst_image[dstCoord] = filter(coord, size); #endif }} " + GetParamBufferDescription(parent.Parameters) + GetTextureParamBindings(parent.TextureParameters, builder)); }
public FilterShader(FilterModel parent, string source, int groupSize, FilterLoader.Type kernel, IShaderBuilder builder) { localSize = groupSize; this.parent = parent; is3D = builder.Is3D; shader = new DirectX.Shader(DirectX.Shader.Type.Compute, GetShaderHeader(kernel, builder) + "\n#line 1\n" + source, parent.Filename); if (parent.Parameters.Count != 0) { paramBuffer = new UploadBuffer(4 * parent.Parameters.Count); UpdateParamBuffer(); } }
private static string GetKernelDeclaration(FilterLoader.Type kernel) { switch (kernel) { case FilterLoader.Type.Tex2D: return("(int2 pixel, int2 size)"); case FilterLoader.Type.Dynamic: case FilterLoader.Type.Tex3D: return("(int3 pixel, int3 size)"); case FilterLoader.Type.Color: return("(float4 color)"); } return(""); }