public override void ClearDepthStencil(float depth, byte stencil) { VkClearValue clearValue = new VkClearValue { depthStencil = new VkClearDepthStencilValue(depth, stencil) }; if (_activeRenderPass != VkRenderPass.Null) { VkClearAttachment clearAttachment = new VkClearAttachment { aspectMask = VkImageAspectFlags.Depth | VkImageAspectFlags.Stencil, clearValue = clearValue }; Texture depthTex = _currentFramebuffer.DepthTarget.Value.Target; VkClearRect clearRect = new VkClearRect { baseArrayLayer = 0, layerCount = 1, rect = new VkRect2D(0, 0, depthTex.Width, depthTex.Height) }; vkCmdClearAttachments(_cb, 1, ref clearAttachment, 1, ref clearRect); } else { // Queue up the clear value for the next RenderPass. _depthClearValue = clearValue; } }
protected override void ClearDepthStencilCore(float depth, byte stencil) { VkClearValue clearValue = new VkClearValue { depthStencil = new VkClearDepthStencilValue(depth, stencil) }; if (_activeRenderPass != VkRenderPass.Null) { VkImageAspectFlags aspectMask = VkImageAspectFlags.Depth; if (FormatHelpers.IsStencilFormat(_currentFramebuffer.DepthTarget.Value.Target.Format)) { aspectMask |= VkImageAspectFlags.Stencil; } VkClearAttachment clearAttachment = new VkClearAttachment { aspectMask = aspectMask, clearValue = clearValue }; Texture depthTex = _currentFramebuffer.DepthTarget.Value.Target; uint renderableWidth = _currentFramebuffer.RenderableWidth; uint renderableHeight = _currentFramebuffer.RenderableHeight; if (renderableWidth > 0 && renderableHeight > 0) { VkClearRect clearRect = new VkClearRect { baseArrayLayer = 0, layerCount = 1, rect = new VkRect2D(0, 0, renderableWidth, renderableHeight) }; vkCmdClearAttachments(_cb, 1, ref clearAttachment, 1, ref clearRect); } } else { // Queue up the clear value for the next RenderPass. _depthClearValue = clearValue; } }
private void BeginCurrentRenderPass() { Debug.Assert(_activeRenderPass == VkRenderPass.Null); Debug.Assert(_currentFramebuffer != null); _currentFramebufferEverActive = true; uint attachmentCount = _currentFramebuffer.AttachmentCount; bool haveAnyAttachments = _currentFramebuffer.ColorTargets.Count > 0 || _currentFramebuffer.DepthTarget != null; bool haveAllClearValues = _depthClearValue.HasValue || _currentFramebuffer.DepthTarget == null; bool haveAnyClearValues = _depthClearValue.HasValue; for (int i = 0; i < _currentFramebuffer.ColorTargets.Count; i++) { if (!_validColorClearValues[i]) { haveAllClearValues = false; haveAnyClearValues = true; } else { haveAnyClearValues = true; } } VkRenderPassBeginInfo renderPassBI = VkRenderPassBeginInfo.New(); renderPassBI.renderArea = new VkRect2D(_currentFramebuffer.RenderableWidth, _currentFramebuffer.RenderableHeight); renderPassBI.framebuffer = _currentFramebuffer.CurrentFramebuffer; if (!haveAnyAttachments || !haveAllClearValues) { renderPassBI.renderPass = _newFramebuffer ? _currentFramebuffer.RenderPassNoClear_Init : _currentFramebuffer.RenderPassNoClear_Load; vkCmdBeginRenderPass(_cb, ref renderPassBI, VkSubpassContents.Inline); _activeRenderPass = renderPassBI.renderPass; if (haveAnyClearValues) { if (_depthClearValue.HasValue) { ClearDepthStencil(_depthClearValue.Value.depthStencil.depth, (byte)_depthClearValue.Value.depthStencil.stencil); _depthClearValue = null; } for (uint i = 0; i < _currentFramebuffer.ColorTargets.Count; i++) { if (_validColorClearValues[i]) { _validColorClearValues[i] = false; VkClearValue vkClearValue = _clearValues[i]; RgbaFloat clearColor = new RgbaFloat( vkClearValue.color.float32_0, vkClearValue.color.float32_1, vkClearValue.color.float32_2, vkClearValue.color.float32_3); ClearColorTarget(i, clearColor); } } } } else { // We have clear values for every attachment. renderPassBI.renderPass = _currentFramebuffer.RenderPassClear; fixed(VkClearValue *clearValuesPtr = &_clearValues[0]) { renderPassBI.clearValueCount = attachmentCount; renderPassBI.pClearValues = clearValuesPtr; if (_depthClearValue.HasValue) { _clearValues[_currentFramebuffer.ColorTargets.Count] = _depthClearValue.Value; _depthClearValue = null; } vkCmdBeginRenderPass(_cb, ref renderPassBI, VkSubpassContents.Inline); _activeRenderPass = _currentFramebuffer.RenderPassClear; Util.ClearArray(_validColorClearValues); } } _newFramebuffer = false; }
private void BeginCurrentRenderPass() { Debug.Assert(_activeRenderPass == VkRenderPass.Null); Debug.Assert(_currentFramebuffer != null); _currentFramebufferEverActive = true; uint attachmentCount = _currentFramebuffer.AttachmentCount; bool haveAnyAttachments = _framebuffer.ColorTargets.Count > 0 || _framebuffer.DepthTarget != null; bool haveAllClearValues = _depthClearValue.HasValue || _framebuffer.DepthTarget == null; bool haveAnyClearValues = _depthClearValue.HasValue; for (int i = 0; i < _currentFramebuffer.ColorTargets.Count; i++) { if (!_validColorClearValues[i]) { haveAllClearValues = false; haveAnyClearValues = true; } else { haveAnyClearValues = true; } } VkRenderPassBeginInfo renderPassBI = VkRenderPassBeginInfo.New(); renderPassBI.renderArea = new VkRect2D(_currentFramebuffer.RenderableWidth, _currentFramebuffer.RenderableHeight); renderPassBI.framebuffer = _currentFramebuffer.CurrentFramebuffer; if (!haveAnyAttachments || !haveAllClearValues) { renderPassBI.renderPass = _currentFramebuffer.RenderPassNoClear; vkCmdBeginRenderPass(_cb, ref renderPassBI, VkSubpassContents.Inline); _activeRenderPass = _currentFramebuffer.RenderPassNoClear; if (haveAnyClearValues) { if (_depthClearValue.HasValue) { ClearDepthStencil(_depthClearValue.Value.depthStencil.depth, (byte)_depthClearValue.Value.depthStencil.stencil); _depthClearValue = null; } for (uint i = 0; i < _currentFramebuffer.ColorTargets.Count; i++) { if (_validColorClearValues[i]) { _validColorClearValues[i] = false; VkClearValue vkClearValue = _clearValues[i]; RgbaFloat clearColor = new RgbaFloat( vkClearValue.color.float32_0, vkClearValue.color.float32_1, vkClearValue.color.float32_2, vkClearValue.color.float32_3); ClearColorTarget(i, clearColor); } } } } else { // We have clear values for every attachment. renderPassBI.renderPass = _currentFramebuffer.RenderPassClear; fixed(VkClearValue *clearValuesPtr = &_clearValues[0]) { renderPassBI.clearValueCount = attachmentCount; renderPassBI.pClearValues = clearValuesPtr; if (_depthClearValue.HasValue) { _clearValues[_currentFramebuffer.ColorTargets.Count] = _depthClearValue.Value; } vkCmdBeginRenderPass(_cb, ref renderPassBI, VkSubpassContents.Inline); _activeRenderPass = _currentFramebuffer.RenderPassClear; Util.ClearArray(_validColorClearValues); } } // Set new image layouts foreach (FramebufferAttachment colorTarget in _currentFramebuffer.ColorTargets) { VkTexture vkTex = Util.AssertSubtype <Texture, VkTexture>(colorTarget.Target); VkImageLayout layout = (vkTex.Usage & TextureUsage.Sampled) != 0 ? VkImageLayout.ShaderReadOnlyOptimal : VkImageLayout.ColorAttachmentOptimal; vkTex.SetImageLayout(colorTarget.ArrayLayer, layout); } if (_currentFramebuffer.DepthTarget != null) { VkTexture vkDepthTex = Util.AssertSubtype <Texture, VkTexture>(_currentFramebuffer.DepthTarget.Value.Target); VkImageLayout layout = (vkDepthTex.Usage & TextureUsage.Sampled) != 0 ? VkImageLayout.ShaderReadOnlyOptimal : VkImageLayout.DepthStencilAttachmentOptimal; vkDepthTex.SetImageLayout(_currentFramebuffer.DepthTarget.Value.ArrayLayer, layout); } }