public override MTLRenderPassDescriptor CreateRenderPassDescriptor() { MTLRenderPassDescriptor ret = MTLRenderPassDescriptor.New(); for (int i = 0; i < ColorTargets.Count; i++) { FramebufferAttachment colorTarget = ColorTargets[i]; MTLTexture mtlTarget = Util.AssertSubtype <Texture, MTLTexture>(colorTarget.Target); MTLRenderPassColorAttachmentDescriptor colorDescriptor = ret.colorAttachments[(uint)i]; colorDescriptor.texture = mtlTarget.DeviceTexture; colorDescriptor.loadAction = MTLLoadAction.Load; colorDescriptor.slice = (UIntPtr)colorTarget.ArrayLayer; } if (DepthTarget != null) { MTLTexture mtlDepthTarget = Util.AssertSubtype <Texture, MTLTexture>(DepthTarget.Value.Target); MTLRenderPassDepthAttachmentDescriptor depthDescriptor = ret.depthAttachment; depthDescriptor.loadAction = MTLLoadAction.Load; depthDescriptor.storeAction = MTLStoreAction.Store; depthDescriptor.texture = mtlDepthTarget.DeviceTexture; depthDescriptor.slice = (UIntPtr)DepthTarget.Value.ArrayLayer; if (FormatHelpers.IsStencilFormat(mtlDepthTarget.Format)) { MTLRenderPassStencilAttachmentDescriptor stencilDescriptor = ret.stencilAttachment; stencilDescriptor.loadAction = MTLLoadAction.Load; stencilDescriptor.storeAction = MTLStoreAction.Store; stencilDescriptor.texture = mtlDepthTarget.DeviceTexture; stencilDescriptor.slice = (UIntPtr)DepthTarget.Value.ArrayLayer; } } return(ret); }
void SetupRenderPassDescriptorForTexture(IMTLTexture texture) { if (renderPassDescriptor == null) { renderPassDescriptor = new MTLRenderPassDescriptor(); } MTLRenderPassColorAttachmentDescriptor colorAttachment = renderPassDescriptor.ColorAttachments [0]; colorAttachment.Texture = texture; colorAttachment.LoadAction = MTLLoadAction.Clear; colorAttachment.ClearColor = new MTLClearColor(0.65f, 0.65f, 0.65f, 1.0f); if (SampleCount > 1) { if (msaaTex == null || NeedUpdate(texture, msaaTex)) { var desc = MTLTextureDescriptor.CreateTexture2DDescriptor(MTLPixelFormat.BGRA8Unorm, texture.Width, texture.Height, false); desc.TextureType = MTLTextureType.k2DMultisample; desc.SampleCount = SampleCount; msaaTex = device.CreateTexture(desc); } colorAttachment.Texture = msaaTex; colorAttachment.ResolveTexture = texture; // set store action to resolve in this case colorAttachment.StoreAction = MTLStoreAction.MultisampleResolve; } else { colorAttachment.StoreAction = MTLStoreAction.Store; } if (DepthPixelFormat != MTLPixelFormat.Invalid) { if (depthTex == null || NeedUpdate(texture, depthTex)) { var desc = MTLTextureDescriptor.CreateTexture2DDescriptor(DepthPixelFormat, texture.Width, texture.Height, false); desc.TextureType = (SampleCount > 1) ? MTLTextureType.k2DMultisample : MTLTextureType.k2D; desc.SampleCount = SampleCount; depthTex = device.CreateTexture(desc); MTLRenderPassDepthAttachmentDescriptor depthAttachment = renderPassDescriptor.DepthAttachment; depthAttachment.Texture = depthTex; depthAttachment.LoadAction = MTLLoadAction.Clear; depthAttachment.StoreAction = MTLStoreAction.DontCare; depthAttachment.ClearDepth = 1.0; } } if (StencilPixelFormat != MTLPixelFormat.Invalid) { if (stencilTex == null || NeedUpdate(texture, stencilTex)) { var desc = MTLTextureDescriptor.CreateTexture2DDescriptor(StencilPixelFormat, texture.Width, texture.Height, false); desc.TextureType = (SampleCount > 1) ? MTLTextureType.k2DMultisample : MTLTextureType.k2D; desc.SampleCount = SampleCount; depthTex = device.CreateTexture(desc); MTLRenderPassStencilAttachmentDescriptor stencilAttachment = renderPassDescriptor.StencilAttachment; stencilAttachment.Texture = depthTex; stencilAttachment.LoadAction = MTLLoadAction.Clear; stencilAttachment.StoreAction = MTLStoreAction.DontCare; stencilAttachment.ClearStencil = 1; } } }