public void Run(ImagesModel images, UploadBuffer constantBuffer, ITexture target) { var dev = Device.Get(); dev.Compute.Set(shader.Compute); // src images for (int i = 0; i < images.NumImages; ++i) { dev.Compute.SetShaderResource(i, images.Images[i].Image.View); } for (int curMipmap = 0; curMipmap < images.NumMipmaps; ++curMipmap) { var size = images.GetSize(curMipmap); // dst image dev.Compute.SetUnorderedAccessView(0, target.GetUaView(curMipmap)); for (int curLayer = 0; curLayer < images.NumLayers; ++curLayer) { constantBuffer.SetData(new LayerLevelFilter { Layer = curLayer, Level = curMipmap }); dev.Compute.SetConstantBuffer(0, constantBuffer.Handle); dev.Dispatch( Utility.Utility.DivideRoundUp(size.Width, builder.LocalSizeX), Utility.Utility.DivideRoundUp(size.Height, builder.LocalSizeY), Utility.Utility.DivideRoundUp(size.Depth, builder.LocalSizeZ)); } } // remove images from unordered acces view slots (otherwise they can't be bound as srv later) dev.Compute.SetUnorderedAccessView(0, null); }
/// <summary> /// executes on iteration of the filter (for all layers and mipmaps) /// </summary> /// <param name="image">original images (might be used for texture bindings)</param> /// <param name="src">source texture</param> /// <param name="dst">destination texture</param> /// <param name="cbuffer">buffer that stores some runtime information</param> /// <param name="iteration">current filter iteration. Should be 0 if not separable. Should be 0 or 1 if separable (x- and y-direction pass) or 2 for z-direction pass</param> /// <remarks>make sure to call UpdateParamBuffer() if parameters have changed after the last invocation</remarks> internal void Run(ImagesModel image, ITexture src, ITexture dst, UploadBuffer cbuffer, int iteration) { if (parent.IsSepa) { Debug.Assert(iteration == 0 || iteration == 1 || iteration == 2); } else { Debug.Assert(iteration == 0); } // compatible textures? Debug.Assert(src.Is3D == is3D); Debug.Assert(dst.Is3D == is3D); var dev = Device.Get(); dev.Compute.Set(shader.Compute); // filter parameters (constant) if (paramBuffer != null) { dev.Compute.SetConstantBuffer(1, paramBuffer.Handle); } dev.Compute.SetShaderResource(1, src.View); for (int curMipmap = 0; curMipmap < image.NumMipmaps; ++curMipmap) { // dst texture dev.Compute.SetUnorderedAccessView(0, dst.GetUaView(curMipmap)); var size = image.GetSize(curMipmap); for (int curLayer = 0; curLayer < image.NumLayers; ++curLayer) { // src textures dev.Compute.SetShaderResource(0, src.GetSrView(curLayer, curMipmap)); BindTextureParameters(image, curLayer, curMipmap); cbuffer.SetData(new LayerLevelFilter { Layer = curLayer, Level = curMipmap, FilterX = iteration == 0?1:0, FilterY = iteration == 1?1:0, FilterZ = iteration == 2?1:0 }); dev.Compute.SetConstantBuffer(0, cbuffer.Handle); dev.Dispatch( Utility.Utility.DivideRoundUp(size.Width, localSize), Utility.Utility.DivideRoundUp(size.Height, localSize), Utility.Utility.DivideRoundUp(size.Depth, localSize)); } } // remove texture bindings dev.Compute.SetUnorderedAccessView(0, null); dev.Compute.SetShaderResource(0, null); dev.Compute.SetShaderResource(1, null); }