private void ChangeMsaa(int msaaOption) { TextureSampleCount sampleCount = (TextureSampleCount)msaaOption; _newSampleCount = sampleCount; }
public MTLGraphicsDevice( GraphicsDeviceOptions options, SwapchainDescription?swapchainDesc) { _device = MTLDevice.MTLCreateSystemDefaultDevice(); _deviceName = _device.name; MetalFeatures = new MTLFeatureSupport(_device); int major = (int)MetalFeatures.MaxFeatureSet / 10000; int minor = (int)MetalFeatures.MaxFeatureSet % 10000; _apiVersion = new GraphicsApiVersion(major, minor, 0, 0); Features = new GraphicsDeviceFeatures( computeShader: true, geometryShader: false, tessellationShaders: false, multipleViewports: MetalFeatures.IsSupported(MTLFeatureSet.macOS_GPUFamily1_v3), samplerLodBias: false, drawBaseVertex: MetalFeatures.IsDrawBaseVertexInstanceSupported(), drawBaseInstance: MetalFeatures.IsDrawBaseVertexInstanceSupported(), drawIndirect: true, drawIndirectBaseInstance: true, fillModeWireframe: true, samplerAnisotropy: true, depthClipDisable: true, texture1D: true, // TODO: Should be macOS 10.11+ and iOS 11.0+. independentBlend: true, structuredBuffer: true, subsetTextureView: true, commandListDebugMarkers: true, bufferRangeBinding: true, shaderFloat64: false); ResourceBindingModel = options.ResourceBindingModel; _libSystem = new NativeLibrary("libSystem.dylib"); _concreteGlobalBlock = _libSystem.LoadFunction("_NSConcreteGlobalBlock"); if (MetalFeatures.IsMacOS) { _completionHandler = OnCommandBufferCompleted; } else { _completionHandler = OnCommandBufferCompleted_Static; } _completionHandlerFuncPtr = Marshal.GetFunctionPointerForDelegate <MTLCommandBufferHandler>(_completionHandler); _completionBlockDescriptor = Marshal.AllocHGlobal(Unsafe.SizeOf <BlockDescriptor>()); BlockDescriptor *descriptorPtr = (BlockDescriptor *)_completionBlockDescriptor; descriptorPtr->reserved = 0; descriptorPtr->Block_size = (ulong)Unsafe.SizeOf <BlockDescriptor>(); _completionBlockLiteral = Marshal.AllocHGlobal(Unsafe.SizeOf <BlockLiteral>()); BlockLiteral *blockPtr = (BlockLiteral *)_completionBlockLiteral; blockPtr->isa = _concreteGlobalBlock; blockPtr->flags = 1 << 28 | 1 << 29; blockPtr->invoke = _completionHandlerFuncPtr; blockPtr->descriptor = descriptorPtr; if (!MetalFeatures.IsMacOS) { lock (s_aotRegisteredBlocks) { s_aotRegisteredBlocks.Add(_completionBlockLiteral, this); } } ResourceFactory = new MTLResourceFactory(this); _commandQueue = _device.newCommandQueue(); TextureSampleCount[] allSampleCounts = (TextureSampleCount[])Enum.GetValues(typeof(TextureSampleCount)); _supportedSampleCounts = new bool[allSampleCounts.Length]; for (int i = 0; i < allSampleCounts.Length; i++) { TextureSampleCount count = allSampleCounts[i]; uint uintValue = FormatHelpers.GetSampleCountUInt32(count); if (_device.supportsTextureSampleCount((UIntPtr)uintValue)) { _supportedSampleCounts[i] = true; } } if (swapchainDesc != null) { SwapchainDescription desc = swapchainDesc.Value; _mainSwapchain = new MTLSwapchain(this, ref desc); } _metalInfo = new BackendInfoMetal(this); PostDeviceCreated(); }
/// <summary> /// Constructs a new <see cref="OutputDescription"/>. /// </summary> /// <param name="depthAttachment">A description of the depth attachment.</param> /// <param name="colorAttachments">An array of descriptions of each color attachment.</param> public OutputDescription(OutputAttachmentDescription?depthAttachment, params OutputAttachmentDescription[] colorAttachments) { DepthAttachment = depthAttachment; ColorAttachments = colorAttachments ?? Array.Empty <OutputAttachmentDescription>(); SampleCount = TextureSampleCount.Count1; }
/// <summary> /// Gets a value indicating whether or not the given <see cref="TextureSampleCount"/> is supported. /// </summary> /// <param name="count">The <see cref="TextureSampleCount"/> to query.</param> /// <returns>True if the sample count is supported; false otherwise.</returns> public bool IsSampleCountSupported(TextureSampleCount count) { int bit = (int)count; return((_sampleCounts & (1 << bit)) != 0); }
public SetMsaaLevelEvent(TextureSampleCount msaaOption) { SampleCount = msaaOption; }
public WindowSizedSceneContext(GraphicsDevice gd, TextureSampleCount sampleCount) { _disposer.DisposeAll(); ResourceFactory factory = new DisposingResourceFactoryFacade(gd.ResourceFactory, _disposer); TextureSamplerResourceLayout = factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription( "SourceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment), new ResourceLayoutElementDescription( "SourceSampler", ResourceKind.Sampler, ShaderStages.Fragment))); TextureSamplerResourceLayout.Name = "RL_TextureSampler"; gd.GetPixelFormatSupport( PixelFormat.R16_G16_B16_A16_Float, TextureType.Texture2D, TextureUsage.RenderTarget, out PixelFormatProperties properties); while (!properties.IsSampleCountSupported(sampleCount)) { sampleCount--; } TextureDescription mainColorDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R16_G16_B16_A16_Float, TextureUsage.RenderTarget | TextureUsage.Sampled, sampleCount); MainSceneColorTexture = factory.CreateTexture(ref mainColorDesc); MainSceneColorTexture.Name = "T_MainSceneColor"; if (sampleCount != TextureSampleCount.Count1) { mainColorDesc.SampleCount = TextureSampleCount.Count1; MainSceneResolvedColorTexture = factory.CreateTexture(ref mainColorDesc); MainSceneResolvedColorTexture.Name = "T_MainSceneResolvedColor"; } else { MainSceneResolvedColorTexture = MainSceneColorTexture; } MainSceneResolvedColorView = factory.CreateTextureView(MainSceneResolvedColorTexture); MainSceneDepthTexture = factory.CreateTexture(TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R32_Float, TextureUsage.DepthStencil, sampleCount)); MainSceneFramebuffer = factory.CreateFramebuffer(new FramebufferDescription(MainSceneDepthTexture, MainSceneColorTexture)); MainSceneViewResourceSet = factory.CreateResourceSet( new ResourceSetDescription( TextureSamplerResourceLayout, MainSceneResolvedColorView, gd.PointSampler)); MainSceneResolvedColorView.Name = "TV_MainSceneResolvedColor"; MainSceneDepthTexture.Name = "T_MainSceneDepth"; MainSceneFramebuffer.Name = "FB_MainFrame"; MainSceneViewResourceSet.Name = "RS_MainFrame"; TextureDescription colorTargetDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R16_G16_B16_A16_Float, TextureUsage.RenderTarget | TextureUsage.Sampled); DuplicatorTarget0 = factory.CreateTexture(ref colorTargetDesc); DuplicatorTargetView0 = factory.CreateTextureView(DuplicatorTarget0); DuplicatorTargetSet0 = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, DuplicatorTargetView0, gd.PointSampler)); DuplicatorTarget0.Name = "T_DuplicatorTarget"; DuplicatorTargetView0.Name = "TV_DuplicatorTarget"; DuplicatorTargetSet0.Name = "RS_DuplicatorTarget"; FramebufferDescription fbDesc = new FramebufferDescription(null, DuplicatorTarget0); DuplicatorFramebuffer = factory.CreateFramebuffer(ref fbDesc); DuplicatorFramebuffer.Name = "FB_Duplicator"; }
internal void RecreateWindowSizedResources(GraphicsDevice gd, CommandList cl) { MainSceneColorTexture?.Dispose(); MainSceneDepthTexture?.Dispose(); MainSceneResolvedColorTexture?.Dispose(); MainSceneResolvedColorView?.Dispose(); MainSceneViewResourceSet?.Dispose(); MainSceneFramebuffer?.Dispose(); DuplicatorTarget0?.Dispose(); DuplicatorTarget1?.Dispose(); DuplicatorTargetView0?.Dispose(); DuplicatorTargetView1?.Dispose(); DuplicatorTargetSet0?.Dispose(); DuplicatorTargetSet1?.Dispose(); DuplicatorFramebuffer?.Dispose(); ResourceFactory factory = gd.ResourceFactory; TextureSampleCount mainSceneSampleCountCapped = (TextureSampleCount)Math.Min( (int)gd.GetSampleCountLimit(PixelFormat.R8_G8_B8_A8_UNorm, false), (int)MainSceneSampleCount); TextureDescription mainColorDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.RenderTarget | TextureUsage.Sampled, mainSceneSampleCountCapped); MainSceneColorTexture = factory.CreateTexture(ref mainColorDesc); if (mainSceneSampleCountCapped != TextureSampleCount.Count1) { mainColorDesc.SampleCount = TextureSampleCount.Count1; MainSceneResolvedColorTexture = factory.CreateTexture(ref mainColorDesc); } else { MainSceneResolvedColorTexture = MainSceneColorTexture; } MainSceneResolvedColorView = factory.CreateTextureView(MainSceneResolvedColorTexture); MainSceneDepthTexture = factory.CreateTexture(TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R32_Float, TextureUsage.DepthStencil, mainSceneSampleCountCapped)); MainSceneFramebuffer = factory.CreateFramebuffer(new FramebufferDescription(MainSceneDepthTexture, MainSceneColorTexture)); MainSceneViewResourceSet = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, MainSceneResolvedColorView, gd.PointSampler)); TextureDescription colorTargetDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.RenderTarget | TextureUsage.Sampled); DuplicatorTarget0 = factory.CreateTexture(ref colorTargetDesc); DuplicatorTargetView0 = factory.CreateTextureView(DuplicatorTarget0); DuplicatorTarget1 = factory.CreateTexture(ref colorTargetDesc); DuplicatorTargetView1 = factory.CreateTextureView(DuplicatorTarget1); DuplicatorTargetSet0 = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, DuplicatorTargetView0, gd.PointSampler)); DuplicatorTargetSet1 = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, DuplicatorTargetView1, gd.PointSampler)); FramebufferDescription fbDesc = new FramebufferDescription(null, DuplicatorTarget0, DuplicatorTarget1); DuplicatorFramebuffer = factory.CreateFramebuffer(ref fbDesc); }
internal void RecreateWindowSizedResources(GraphicsDevice gd, CommandList cl) { MainSceneColorTexture?.Dispose(); MainSceneDepthTexture?.Dispose(); MainSceneResolvedColorTexture?.Dispose(); MainSceneResolvedColorView?.Dispose(); MainSceneViewResourceSet?.Dispose(); MainSceneFramebuffer?.Dispose(); DuplicatorTarget0?.Dispose(); DuplicatorTarget1?.Dispose(); DuplicatorTargetView0?.Dispose(); DuplicatorTargetView1?.Dispose(); DuplicatorTargetSet0?.Dispose(); DuplicatorTargetSet1?.Dispose(); DuplicatorFramebuffer?.Dispose(); ResourceFactory factory = gd.ResourceFactory; gd.GetPixelFormatSupport( PixelFormat.R8_G8_B8_A8_UNorm, TextureType.Texture2D, TextureUsage.RenderTarget, out PixelFormatProperties properties); TextureSampleCount sampleCount = MainSceneSampleCount; while (!properties.IsSampleCountSupported(sampleCount)) { sampleCount = (TextureSampleCount)(sampleCount - 1); } TextureDescription mainColorDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.RenderTarget | TextureUsage.Sampled, sampleCount); MainSceneColorTexture = factory.CreateTexture(ref mainColorDesc); if (sampleCount != TextureSampleCount.Count1) { mainColorDesc.SampleCount = TextureSampleCount.Count1; MainSceneResolvedColorTexture = factory.CreateTexture(ref mainColorDesc); } else { MainSceneResolvedColorTexture = MainSceneColorTexture; } MainSceneResolvedColorView = factory.CreateTextureView(MainSceneResolvedColorTexture); MainSceneDepthTexture = factory.CreateTexture(TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R32_Float, TextureUsage.DepthStencil, sampleCount)); MainSceneFramebuffer = factory.CreateFramebuffer(new FramebufferDescription(MainSceneDepthTexture, MainSceneColorTexture)); MainSceneViewResourceSet = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, MainSceneResolvedColorView, gd.PointSampler)); TextureDescription colorTargetDesc = TextureDescription.Texture2D( gd.SwapchainFramebuffer.Width, gd.SwapchainFramebuffer.Height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.RenderTarget | TextureUsage.Sampled); DuplicatorTarget0 = factory.CreateTexture(ref colorTargetDesc); DuplicatorTargetView0 = factory.CreateTextureView(DuplicatorTarget0); DuplicatorTarget1 = factory.CreateTexture(ref colorTargetDesc); DuplicatorTargetView1 = factory.CreateTextureView(DuplicatorTarget1); DuplicatorTargetSet0 = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, DuplicatorTargetView0, gd.PointSampler)); DuplicatorTargetSet1 = factory.CreateResourceSet(new ResourceSetDescription(TextureSamplerResourceLayout, DuplicatorTargetView1, gd.PointSampler)); FramebufferDescription fbDesc = new FramebufferDescription(null, DuplicatorTarget0, DuplicatorTarget1); DuplicatorFramebuffer = factory.CreateFramebuffer(ref fbDesc); }