private async void GpuViewHost_ChildChanged(object sender, EventArgs e) { WindowsXamlHost windowsXamlHost = (WindowsXamlHost)sender; SwapChainPanel swapChainPanel = (SwapChainPanel)windowsXamlHost.Child; GpuView = swapChainPanel; Gpu = new Gpu(); #if DEBUG Gpu.EnableD3D12DebugLayer(); #endif GpuView.Width = this.Width; GpuView.Height = this.Height; await Init(); SizeChanged += MainWindow_SizeChanged; GpuFence fence = Device.DefaultQueue.CreateFence(); UInt64 currentFenceValue = 0; while (true) { if (SwapChain == null) { SwapChainDescriptor = new GpuSwapChainDescriptor(GpuTextureFormat.BGRA8UNorm, (uint)GpuView.Width, (uint)GpuView.Height); SwapChain = Device.ConfigureSwapChainForSwapChainPanel(SwapChainDescriptor, GpuView); DepthTexture = Device.CreateTexture(new GpuTextureDescriptor(new GpuExtend3DDict { Width = SwapChainDescriptor.Width, Height = SwapChainDescriptor.Height, Depth = 1 }, GpuTextureFormat.Depth24PlusStencil8, GpuTextureUsageFlags.OutputAttachment)); } DrawFrame(); var fenceValueWaitFor = ++currentFenceValue; Device.DefaultQueue.Signal(fence, fenceValueWaitFor); await fence.OnCompletionAsync(fenceValueWaitFor); } }
public MainPage() { Gpu = new Gpu(); Gpu.EnableD3D12DebugLayer(); this.InitializeComponent(); ApplicationView.PreferredLaunchViewSize = new Size(512, 512); ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize; }
public MainPage() { Gpu = new Gpu(); Gpu.EnableD3D12DebugLayer(); this.InitializeComponent(); ApplicationView.PreferredLaunchViewSize = new Size(512, 512); ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize; GpuView.Width = Window.Current.Bounds.Width; GpuView.Height = Window.Current.Bounds.Height; }
public MainPage() { Gpu = new Gpu(); #if DEBUG Gpu.EnableD3D12DebugLayer(); #endif this.InitializeComponent(); ApplicationView.PreferredLaunchViewSize = new Size(512, 512); ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize; DataContext = ViewModel = new ViewModel(); }
async Task Init() { var gpu = new Gpu(); #if DEBUG gpu.EnableD3D12DebugLayer(); #endif var adapter = await gpu.RequestAdapterAsync(); Device = await adapter.RequestDeviceAsync(); TimeBindGroupLayout = Device.CreateBindGroupLayout(new GpuBindGroupLayoutDescriptor(new GpuBindGroupLayoutEntry[] { new GpuBindGroupLayoutEntry() { Binding = 0, Visibility = GpuShaderStageFlags.Vertex, Buffer = new GpuBufferBindingLayout() { Type = GpuBufferBindingType.Uniform, MinBindingSize = sizeof(float) } } })); BindGroupLayout = Device.CreateBindGroupLayout(new GpuBindGroupLayoutDescriptor(new GpuBindGroupLayoutEntry[] { new GpuBindGroupLayoutEntry() { Binding = 0, Visibility = GpuShaderStageFlags.Vertex, Buffer = new GpuBufferBindingLayout() { Type = GpuBufferBindingType.Uniform, MinBindingSize = 20 } } })); DynamicBindGroupLayout = Device.CreateBindGroupLayout(new GpuBindGroupLayoutDescriptor(new GpuBindGroupLayoutEntry[] { new GpuBindGroupLayoutEntry() { Binding = 0, Visibility = GpuShaderStageFlags.Vertex, Buffer = new GpuBufferBindingLayout() { Type = GpuBufferBindingType.Uniform, HasDynamicOffset = true, MinBindingSize = 20 } } })); var pipelineLayout = Device.CreatePipelineLayout(new GpuPipelineLayoutDescriptor() { BindGroupLayouts = new GpuBindGroupLayout[] { TimeBindGroupLayout, BindGroupLayout } }); var dynamicPipelineLayout = Device.CreatePipelineLayout(new GpuPipelineLayoutDescriptor() { BindGroupLayouts = new GpuBindGroupLayout[] { TimeBindGroupLayout, DynamicBindGroupLayout } }); string shaderCode; using (var shaderFileStream = typeof(MainPage).Assembly.GetManifestResourceStream("Animometer.shader.hlsl")) using (var shaderStreamReader = new StreamReader(shaderFileStream)) { shaderCode = shaderStreamReader.ReadToEnd(); } var shader = Device.CreateShaderModule(new GpuShaderModuleDescriptor(GpuShaderSourceType.Hlsl, shaderCode)); var pipelineDescriptor = new GpuRenderPipelineDescriptor(new GpuVertexState(shader, "VSMain") { VertexBuffers = new GpuVertexBufferLayout[] { new GpuVertexBufferLayout(2 * Vec4Size, new GpuVertexAttribute[] { new GpuVertexAttribute() { ShaderLocation = 0, Offset = 0, Format = GpuVertexFormat.Float4 }, new GpuVertexAttribute() { ShaderLocation = 1, Offset = Vec4Size, Format = GpuVertexFormat.Float4 } }) { StepMode = GpuInputStepMode.Vertex } } }) { Fragment = new GpuFragmentState(shader, "PSMain", new GpuColorTargetState[] { new GpuColorTargetState() { Format = SwapChainFormat } }), Primitive = new GpuPrimitiveState() { Topology = GpuPrimitiveTopology.TriangleList, FrontFace = GpuFrontFace.Ccw, CullMode = GpuCullMode.None } }; pipelineDescriptor.Layout = pipelineLayout; Pipeline = Device.CreateRenderPipeline(pipelineDescriptor); pipelineDescriptor.Layout = dynamicPipelineLayout; DynamicPipeline = Device.CreateRenderPipeline(pipelineDescriptor); VertexBuffer = Device.CreateBuffer(new GpuBufferDescriptor(2 * 3 * Vec4Size, GpuBufferUsageFlags.Vertex) { MappedAtCreation = true }); float[] vertexData = new float[] { 0, 0.1f, 0, 1, 1, 0, 0, 1, -0.1f, -0.1f, 0, 1, 0, 1, 0, 1, 0.1f, -0.1f, 0, 1, 0, 0, 1, 1 }; Windows.Storage.Streams.Buffer verticeCpuBuffer = new Windows.Storage.Streams.Buffer((uint)Buffer.ByteLength(vertexData)); verticeCpuBuffer.Length = verticeCpuBuffer.Capacity; using (var verticeCpuStream = verticeCpuBuffer.AsStream()) { byte[] vertexBufferBytes = new byte[Buffer.ByteLength(vertexData)]; Buffer.BlockCopy(vertexData, 0, vertexBufferBytes, 0, Buffer.ByteLength(vertexData)); await verticeCpuStream.WriteAsync(vertexBufferBytes, 0, Buffer.ByteLength(vertexData)); } verticeCpuBuffer.CopyTo(VertexBuffer.GetMappedRange()); VertexBuffer.Unmap(); }
async Task Init() { var gpu = new Gpu(); #if DEBUG gpu.EnableD3D12DebugLayer(); #endif Device = await(await gpu.RequestAdapterAsync()).RequestDeviceAsync(); Windows.Storage.Streams.Buffer verticeCpuBuffer = new Windows.Storage.Streams.Buffer((uint)Buffer.ByteLength(Cube.CubeVertexArray)); verticeCpuBuffer.Length = verticeCpuBuffer.Capacity; using (var verticeCpuStream = verticeCpuBuffer.AsStream()) { byte[] vertexBufferBytes = new byte[Buffer.ByteLength(Cube.CubeVertexArray)]; Buffer.BlockCopy(Cube.CubeVertexArray, 0, vertexBufferBytes, 0, Buffer.ByteLength(Cube.CubeVertexArray)); await verticeCpuStream.WriteAsync(vertexBufferBytes, 0, Buffer.ByteLength(Cube.CubeVertexArray)); } VerticesBuffer = Device.CreateBuffer(new GpuBufferDescriptor((ulong)Buffer.ByteLength(Cube.CubeVertexArray), GpuBufferUsageFlags.Vertex) { MappedAtCreation = true }); verticeCpuBuffer.CopyTo(VerticesBuffer.GetMappedRange()); VerticesBuffer.Unmap(); string shaderCode; using (var shaderFileStream = typeof(MainPage).Assembly.GetManifestResourceStream("RotatingCube.shader.hlsl")) using (var shaderStreamReader = new StreamReader(shaderFileStream)) { shaderCode = shaderStreamReader.ReadToEnd(); } var shader = Device.CreateShaderModule(new GpuShaderModuleDescriptor(GpuShaderSourceType.Hlsl, shaderCode)); //var shader = Device.CreateShaderModule(new GpuShaderModuleDescriptor(GpuShaderSourceType.Hlsl, )) var vertexState = new GpuVertexState(shader, "VSMain") { VertexBuffers = new GpuVertexBufferLayout[] { new GpuVertexBufferLayout(Cube.CubeVertexSize, new GpuVertexAttribute[] { new GpuVertexAttribute() { ShaderLocation = 0, Format = GpuVertexFormat.Float4, Offset = Cube.CubePositionOffset }, new GpuVertexAttribute() { ShaderLocation = 1, Format = GpuVertexFormat.Float4, Offset = Cube.CubeColorOffset } }) } }; var fragmentState = new GpuFragmentState(shader, "PSMain", new GpuColorTargetState[] { new GpuColorTargetState { Format = GpuTextureFormat.BGRA8UNorm, Blend = null, WriteMask = GpuColorWriteFlags.All } }); var primitiveState = new GpuPrimitiveState { Topology = GpuPrimitiveTopology.TriangleList, FrontFace = GpuFrontFace.Ccw, CullMode = GpuCullMode.Back, StripIndexFormat = null }; var depthState = new GpuDepthStencilState(GpuTextureFormat.Depth24PlusStencil8) { DepthWriteEnabled = true, DepthCompare = GpuCompareFunction.Less, }; var uniformBindGroupLayout = Device.CreateBindGroupLayout(new GpuBindGroupLayoutDescriptor(new GpuBindGroupLayoutEntry[] { new GpuBindGroupLayoutEntry() { Binding = 0, Visibility = GpuShaderStageFlags.Vertex, Buffer = new GpuBufferBindingLayout { Type = GpuBufferBindingType.Uniform, HasDynamicOffset = false, MinBindingSize = UniformBufferSize } } })); var pipelineLayout = Device.CreatePipelineLayout(new GpuPipelineLayoutDescriptor() { BindGroupLayouts = new GpuBindGroupLayout[] { uniformBindGroupLayout } }); Pipeline = Device.CreateRenderPipeline(new GpuRenderPipelineDescriptor(vertexState) { Fragment = fragmentState, Primitive = primitiveState, DepthStencilState = depthState, Layout = pipelineLayout }); UniformBuffer = Device.CreateBuffer(new GpuBufferDescriptor(UniformBufferSize, GpuBufferUsageFlags.Uniform | GpuBufferUsageFlags.CopyDst)); UniformCpuBuffer = new Windows.Storage.Streams.Buffer(4 * 4 * sizeof(float)); UniformCpuBuffer.Length = UniformCpuBuffer.Capacity; UniformBindGroup = Device.CreateBindGroup(new GpuBindGroupDescriptor(uniformBindGroupLayout, new GpuBindGroupEntry[] { new GpuBindGroupEntry(0, new GpuBufferBinding(UniformBuffer, UniformBufferSize)) })); }
async Task Init() { var gpu = new Gpu(); #if DEBUG gpu.EnableD3D12DebugLayer(); #endif Device = await(await gpu.RequestAdapterAsync()).RequestDeviceAsync(); Windows.Storage.Streams.Buffer verticeCpuBuffer = new Windows.Storage.Streams.Buffer((uint)Buffer.ByteLength(Cube.CubeVertexArray)); verticeCpuBuffer.Length = verticeCpuBuffer.Capacity; using (var verticeCpuStream = verticeCpuBuffer.AsStream()) { byte[] vertexBufferBytes = new byte[Buffer.ByteLength(Cube.CubeVertexArray)]; Buffer.BlockCopy(Cube.CubeVertexArray, 0, vertexBufferBytes, 0, Buffer.ByteLength(Cube.CubeVertexArray)); await verticeCpuStream.WriteAsync(vertexBufferBytes, 0, Buffer.ByteLength(Cube.CubeVertexArray)); } VerticesBuffer = Device.CreateBuffer(new GpuBufferDescriptor((ulong)Buffer.ByteLength(Cube.CubeVertexArray), GpuBufferUsageFlags.Vertex) { MappedAtCreation = true }); verticeCpuBuffer.CopyTo(VerticesBuffer.GetMappedRange()); VerticesBuffer.Unmap(); string shaderCode; using (var shaderFileStream = typeof(MainPage).Assembly.GetManifestResourceStream("TexturedCube.shader.hlsl")) using (var shaderStreamReader = new StreamReader(shaderFileStream)) { shaderCode = shaderStreamReader.ReadToEnd(); } var shader = Device.CreateShaderModule(new GpuShaderModuleDescriptor(GpuShaderSourceType.Hlsl, shaderCode)); var vertexState = new GpuVertexState(shader, "VSMain") { VertexBuffers = new GpuVertexBufferLayout[] { new GpuVertexBufferLayout(Cube.CubeVertexSize, new GpuVertexAttribute[] { new GpuVertexAttribute() { ShaderLocation = 0, Format = GpuVertexFormat.Float4, Offset = Cube.CubePositionOffset }, new GpuVertexAttribute() { ShaderLocation = 1, Format = GpuVertexFormat.Float2, Offset = Cube.CubeUVOffset } }) } }; var fragmentState = new GpuFragmentState(shader, "PSMain", new GpuColorTargetState[] { new GpuColorTargetState { Format = GpuTextureFormat.BGRA8UNorm, Blend = null, WriteMask = GpuColorWriteFlags.All } }); var primitiveState = new GpuPrimitiveState { Topology = GpuPrimitiveTopology.TriangleList, FrontFace = GpuFrontFace.Ccw, CullMode = GpuCullMode.Back, StripIndexFormat = null }; var depthState = new GpuDepthStencilState(GpuTextureFormat.Depth24PlusStencil8) { DepthWriteEnabled = true, DepthCompare = GpuCompareFunction.Less, }; var uniformBindGroupLayout = Device.CreateBindGroupLayout(new GpuBindGroupLayoutDescriptor(new GpuBindGroupLayoutEntry[] { new GpuBindGroupLayoutEntry() { Binding = 0, Visibility = GpuShaderStageFlags.Vertex, Buffer = new GpuBufferBindingLayout { Type = GpuBufferBindingType.Uniform, HasDynamicOffset = false, MinBindingSize = UniformBufferSize } }, new GpuBindGroupLayoutEntry() { Binding = 1, Visibility = GpuShaderStageFlags.Fragment, Sampler = new GpuSamplerBindingLayout() { Type = GpuSamplerBindingType.Filtering } }, new GpuBindGroupLayoutEntry() { Binding = 2, Visibility = GpuShaderStageFlags.Fragment, Texture = new GpuTextureBindingLayout() { SampleType = GpuTextureSampleType.Float, ViewDimension = GpuTextureViewDimension._2D, Multisampled = false } } })); var pipelineLayout = Device.CreatePipelineLayout(new GpuPipelineLayoutDescriptor() { BindGroupLayouts = new GpuBindGroupLayout[] { uniformBindGroupLayout } }); Pipeline = Device.CreateRenderPipeline(new GpuRenderPipelineDescriptor(vertexState) { Fragment = fragmentState, Primitive = primitiveState, DepthStencilState = depthState, Layout = pipelineLayout }); UniformBuffer = Device.CreateBuffer(new GpuBufferDescriptor(UniformBufferSize, GpuBufferUsageFlags.Uniform | GpuBufferUsageFlags.CopyDst)); UniformCpuBuffer = new Windows.Storage.Streams.Buffer(4 * 4 * sizeof(float)); UniformCpuBuffer.Length = UniformCpuBuffer.Capacity; var imgDecoder = await BitmapDecoder.CreateAsync(typeof(MainPage).Assembly.GetManifestResourceStream("TexturedCube.Di_3d.png").AsRandomAccessStream()); var imageBitmap = await imgDecoder.GetSoftwareBitmapAsync(); var cubeTexture = Device.CreateTexture(new GpuTextureDescriptor(new GpuExtend3DDict { Width = (uint)imageBitmap.PixelWidth, Height = (uint)imageBitmap.PixelHeight, Depth = 1 }, GpuTextureFormat.BGRA8UNorm, GpuTextureUsageFlags.Sampled | GpuTextureUsageFlags.CopyDst)); Device.DefaultQueue.CopyImageBitmapToTexture(new GpuImageCopyImageBitmap(imageBitmap), new GpuImageCopyTexture(cubeTexture), new GpuExtend3DDict { Width = (uint)imageBitmap.PixelWidth, Height = (uint)imageBitmap.PixelHeight, Depth = 1 }); var sampler = Device.CreateSampler(new GpuSamplerDescriptor() { MagFilter = GpuFilterMode.Linear, MinFilter = GpuFilterMode.Linear }); UniformBindGroup = Device.CreateBindGroup(new GpuBindGroupDescriptor(uniformBindGroupLayout, new GpuBindGroupEntry[] { new GpuBindGroupEntry(0, new GpuBufferBinding(UniformBuffer, UniformBufferSize)), new GpuBindGroupEntry(1, sampler), new GpuBindGroupEntry(2, cubeTexture.CreateView()) })); }