public static VkClearValue AsClearValue(this VkClearDepthStencilValue val) { return(new VkClearValue() { DepthStencil = val }); }
public static extern void CmdClearDepthStencilImage( VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, ref VkClearDepthStencilValue pDepthStencil, uint rangeCount, IntPtr pRanges );
/// <summary> /// Must be called outside of a renderpass scope. /// </summary> /// <param name="depthStencil"></param> /// <param name="clearValue"></param> public void ClearDepthStencil(DepthStencil depthStencil, VkClearDepthStencilValue clearValue) { CheckBegun(); CheckNotInRenderPass(); VkImageSubresourceRange imageRange = new VkImageSubresourceRange(); imageRange.aspectMask = VkImageAspectFlags.Depth; imageRange.levelCount = 1; imageRange.layerCount = 1; vkCmdClearDepthStencilImage(vkCmd, depthStencil.vkImage, VkImageLayout.General, &clearValue, 1, &imageRange); }
/// <summary> /// Begin renderpass and clear the color and depth of the supplied framebuffer. /// </summary> /// <param name="renderPass"></param> /// <param name="frameBuffer"></param> /// <param name="clearColor"></param> /// <param name="clearDepth"></param> public void BeginRenderPassClearColorDepth(RenderPass renderPass, FrameBuffer frameBuffer, VkClearColorValue clearColor, VkClearDepthStencilValue clearDepth, bool useSecondaryCommandBuffers) { CheckBegun(); CheckNotInRenderPass(); FixedArray2 <VkClearValue> clearValues = new FixedArray2 <VkClearValue>(); clearValues.First.color = clearColor; clearValues.Second.depthStencil = clearDepth; VkRenderPassBeginInfo renderPassBeginInfo = Initializers.renderPassBeginInfo(); renderPassBeginInfo.renderPass = renderPass.vkRenderPass; renderPassBeginInfo.renderArea.offset.x = 0; renderPassBeginInfo.renderArea.offset.y = 0; renderPassBeginInfo.renderArea.extent.width = frameBuffer.swapchain.width; renderPassBeginInfo.renderArea.extent.height = frameBuffer.swapchain.height; renderPassBeginInfo.clearValueCount = 2; renderPassBeginInfo.pClearValues = &clearValues.First; renderPassBeginInfo.framebuffer = frameBuffer.vkFrameBuffer; renderPassUseSecondaryBuffers = useSecondaryCommandBuffers; VkSubpassContents subPassContents = useSecondaryCommandBuffers ? VkSubpassContents.SecondaryCommandBuffers : VkSubpassContents.Inline; vkCmdBeginRenderPass(vkCmd, &renderPassBeginInfo, subPassContents); VkViewport viewport = Initializers.viewport((float)frameBuffer.swapchain.width, (float)frameBuffer.swapchain.height, 0.0f, 1.0f); vkCmdSetViewport(vkCmd, 0, 1, &viewport); VkRect2D scissor = Initializers.rect2D(frameBuffer.swapchain.width, frameBuffer.swapchain.height, 0, 0); vkCmdSetScissor(vkCmd, 0, 1, &scissor); inRenderPass = true; }
private void Vkctrl_VulkanRendering(object sender, SharpVulkanWpf.VulkanEventArgs args) { var device = args.Device; var image = vkctrl.AcquireNextImage(); var framebuffer = vkctrl.AcquireNextFramebuffer(); var command = m_commandBuffers[0]; VulkanAPI.vkBeginCommandBuffer(command); VkClearColorValue clearColor = new VkClearColorValue(); clearColor.valF32.R = 0.125f; clearColor.valF32.G = 0.25f; clearColor.valF32.B = 0.4f; clearColor.valF32.A = 1.0f; VkClearDepthStencilValue clearDepth = new VkClearDepthStencilValue() { depth = 1.0f, stencil = 0, }; var currentExtent = vkctrl.GetCurrentExtent(); // 定数バッファの更新. var sceneTrs = new Transform(); var aspect = (float)currentExtent.width / (float)currentExtent.height; var proj = mat4.Perspective((float)Math.PI / 3.0f, aspect, 1.0f, 100.0f); sceneTrs.World = mat4.RotateY(m_frameCount * 0.05f) * mat4.RotateX(m_frameCount * 0.01f); sceneTrs.View = mat4.LookAt(new vec3(0, 0, 6), new vec3(0, 0, 0), new vec3(0, 1, 0)); sceneTrs.Proj = proj; MappedMemoryStream mapped = null; VulkanAPI.vkMapMemory(device, m_uniformBufferMemory, 0, VkDeviceSize.VK_WHOLE_SIZE, 0, out mapped); mapped.Write(sceneTrs); VulkanAPI.vkUnmapMemory(device, m_uniformBufferMemory); var renderArea = new VkRect2D() { offset = new VkOffset2D(), extent = vkctrl.GetCurrentExtent(), }; var renderPassBeginInfo = new VkRenderPassBeginInfo() { framebuffer = framebuffer, renderArea = renderArea, renderPass = vkctrl.GetControlRenderPass(), pClearValues = new[] { new VkClearValue() { color = clearColor }, new VkClearValue() { depthStencil = clearDepth }, } }; VulkanAPI.vkCmdBeginRenderPass(command, ref renderPassBeginInfo, VkSubpassContents.VK_SUBPASS_CONTENTS_INLINE); VulkanAPI.vkCmdBindPipeline(command, VkPipelineBindPoint.VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline); VulkanAPI.vkCmdBindVertexBuffers(command, 0, 1, new[] { m_vertexBuffer }, new[] { (VkDeviceSize)0 }); VulkanAPI.vkCmdBindIndexBuffer(command, m_indexBuffer, 0, VkIndexType.VK_INDEX_TYPE_UINT16); VulkanAPI.vkCmdBindDescriptorSets(command, VkPipelineBindPoint.VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, new[] { m_descriptorSet }, null); VulkanAPI.vkCmdDrawIndexed(command, 36, 1, 0, 0, 0); VulkanAPI.vkCmdEndRenderPass(command); VulkanAPI.vkEndCommandBuffer(command); var submitInfo = new VkSubmitInfo() { commandBuffers = new[] { command } }; VulkanAPI.vkQueueSubmit(args.GraphicsQueue, submitInfo, null); vkctrl.SwapBuffers(); m_frameCount++; }
public void CmdClearDepthStencilImage( [FromProperty("this")] GenCommandBuffer commandBuffer, GenImage image, VkImageLayout imageLayout, VkClearDepthStencilValue* pDepthStencil, [CountFor("ranges")] int rangeCount, [IsArray] VkImageSubresourceRange* pRanges) { }
private void FlushFrameDrawCommands() { _scInfo.AcquireNextImage(_device, _imageAvailableSemaphore); for (int i = 0; i < _renderPassStates.Count; i++) { RenderPassInfo renderPassState = _renderPassStates[i]; VkCommandBuffer primaryCommandBuffer = GetPrimaryCommandBuffer(); renderPassState.PrimaryCommandBuffer = primaryCommandBuffer; VkCommandBufferBeginInfo beginInfo = VkCommandBufferBeginInfo.New(); beginInfo.flags = VkCommandBufferUsageFlags.OneTimeSubmit; vkBeginCommandBuffer(primaryCommandBuffer, ref beginInfo); VkRenderPassBeginInfo renderPassBeginInfo = VkRenderPassBeginInfo.New(); VkFramebufferBase fbInfo = renderPassState.Framebuffer; renderPassBeginInfo.framebuffer = fbInfo.VkFramebuffer; renderPassBeginInfo.renderPass = renderPassState.ClearBuffer ? fbInfo.RenderPassClearBuffer : fbInfo.RenderPassNoClear; if (renderPassState.ClearBuffer) { VkClearColorValue colorClear = new VkClearColorValue { float32_0 = renderPassState.ClearColor.R, float32_1 = renderPassState.ClearColor.G, float32_2 = renderPassState.ClearColor.B, float32_3 = renderPassState.ClearColor.A }; VkClearDepthStencilValue depthClear = new VkClearDepthStencilValue() { depth = 1f, stencil = 0 }; StackList <VkClearValue, Size512Bytes> clearValues = new StackList <VkClearValue, Size512Bytes>(); if (fbInfo.ColorTexture != null) { clearValues.Add(new VkClearValue() { color = colorClear }); } if (fbInfo.DepthTexture != null) { clearValues.Add(new VkClearValue() { depthStencil = depthClear }); } renderPassBeginInfo.clearValueCount = clearValues.Count; renderPassBeginInfo.pClearValues = (VkClearValue *)clearValues.Data; } renderPassBeginInfo.renderArea.extent = new VkExtent2D(fbInfo.Width, fbInfo.Height); vkCmdBeginRenderPass(primaryCommandBuffer, ref renderPassBeginInfo, VkSubpassContents.SecondaryCommandBuffers); RawList <VkCommandBuffer> secondaryCBs = renderPassState.SecondaryCommandBuffers; if (secondaryCBs.Count > 0) { vkCmdExecuteCommands(primaryCommandBuffer, secondaryCBs.Count, ref secondaryCBs[0]); } vkCmdEndRenderPass(primaryCommandBuffer); vkEndCommandBuffer(primaryCommandBuffer); VkSubmitInfo submitInfo = VkSubmitInfo.New(); VkSemaphore waitSemaphore = (i == 0) ? _imageAvailableSemaphore : _renderPassSemaphores[i - 1]; VkPipelineStageFlags waitStages = VkPipelineStageFlags.ColorAttachmentOutput; submitInfo.waitSemaphoreCount = 1; submitInfo.pWaitSemaphores = &waitSemaphore; submitInfo.pWaitDstStageMask = &waitStages; VkCommandBuffer cb = primaryCommandBuffer; submitInfo.commandBufferCount = 1; submitInfo.pCommandBuffers = &cb; VkSemaphore signalSemaphore = _renderPassSemaphores[i]; submitInfo.signalSemaphoreCount = 1; submitInfo.pSignalSemaphores = &signalSemaphore; vkQueueSubmit(_graphicsQueue, 1, ref submitInfo, VkFence.Null); } }
public void Execute(VkCommandBuffer buffer) { VkImageMemoryBarrier imageMemoryBarrier = VkImageMemoryBarrier.New(); imageMemoryBarrier.srcAccessMask = VkAccessFlags.None; imageMemoryBarrier.dstAccessMask = VkAccessFlags.ColorAttachmentRead | VkAccessFlags.ColorAttachmentWrite; imageMemoryBarrier.oldLayout = VkImageLayout.Undefined; imageMemoryBarrier.newLayout = VkImageLayout.ColorAttachmentOptimal; imageMemoryBarrier.srcQueueFamilyIndex = VulkanNative.QueueFamilyIgnored; imageMemoryBarrier.dstQueueFamilyIndex = VulkanNative.QueueFamilyIgnored; imageMemoryBarrier.image = swapchainImage; imageMemoryBarrier.subresourceRange = new VkImageSubresourceRange() { baseMipLevel = 0, levelCount = 1, baseArrayLayer = 0, layerCount = 1, aspectMask = VkImageAspectFlags.Color }; vkCmdPipelineBarrier(buffer, VkPipelineStageFlags.AllGraphics, VkPipelineStageFlags.AllGraphics, VkDependencyFlags.ByRegion, 0, null, 0, null, 1, &imageMemoryBarrier); VkClearColorValue clearColorValue = new VkClearColorValue { float32_0 = 3f / 255f, float32_1 = 2f / 255, float32_2 = 12f / 255, float32_3 = 1 }; VkClearDepthStencilValue clearDepthStencilValue = new VkClearDepthStencilValue(1, 0); VkClearValue[] clearValues = new VkClearValue[2]; clearValues[0].color = clearColorValue; clearValues[1].depthStencil = clearDepthStencilValue; VkRenderPassBeginInfo passBeginInfo = VkRenderPassBeginInfo.New(); passBeginInfo.renderPass = renderPass; passBeginInfo.framebuffer = swapchainFramebuffer; passBeginInfo.renderArea.extent.width = (uint)Program.width; passBeginInfo.renderArea.extent.height = (uint)Program.height; passBeginInfo.clearValueCount = (uint)clearValues.Length; fixed(VkClearValue *ptr = clearValues) passBeginInfo.pClearValues = ptr; vkCmdBeginRenderPass(buffer, &passBeginInfo, VkSubpassContents.Inline); VkViewport viewport = new VkViewport(); viewport.x = 0; viewport.y = (float)Program.height; viewport.width = (float)Program.width; viewport.height = -(float)Program.height; VkRect2D scissor = new VkRect2D(); scissor.offset.x = 0; scissor.offset.y = 0; scissor.extent.width = (uint)Program.width; scissor.extent.height = (uint)Program.height; vkCmdSetViewport(buffer, 0, 1, &viewport); vkCmdSetScissor(buffer, 0, 1, &scissor); vkCmdBindPipeline(buffer, VkPipelineBindPoint.Graphics, pipeline); if (mesh.IsReady) { mesh.Use(); VkBuffer[] databuffers = new VkBuffer[] { mesh.Mesh.vertices.Buffer, mesh.Mesh.vertices.Buffer, mesh.Mesh.vertices.Buffer, mesh.Mesh.vertices.Buffer }; ulong[] offsets = new ulong[] { 0, 3 * 4, 6 * 4, 6 * 4 + 2 * 4 }; fixed(VkBuffer *bptr = databuffers) fixed(ulong *optr = offsets) vkCmdBindVertexBuffers(buffer, 0, 4, bptr, optr); vkCmdBindIndexBuffer(buffer, mesh.Mesh.indices.Buffer, 0, VkIndexType.Uint32); uniformdata.Write(0, camera.View.ToFloatArray()); uniformdata.Write(16, camera.Projection.ToFloatArray()); UpdateUniformData(uniformdata, swapchainImageIndex); VkDescriptorSet sets = descriptorSets[swapchainImageIndex]; VkPipelineLayout layout = pipelineLayout; vkCmdBindDescriptorSets(buffer, VkPipelineBindPoint.Graphics, layout, 0, 1, &sets, 0, null); vkCmdDrawIndexed(buffer, (uint)mesh.Mesh.indices.Length, 1, 0, 0, 0); mesh.StopUse(); } vkCmdEndRenderPass(buffer); }
public void CmdClearDepthStencilImage(IVkImage image, VkImageLayout imageLayout, VkClearDepthStencilValue depthStencil, IReadOnlyList<VkImageSubresourceRange> ranges) { var unmanagedSize = ranges.SizeOfMarshalDirect(); var unmanagedArray = new byte[unmanagedSize]; fixed (byte* unmanagedStart = unmanagedArray) { var unmanaged = unmanagedStart; var _commandBuffer = Handle; var _image = image?.Handle ?? VkImage.HandleType.Null; var _imageLayout = imageLayout; var _pDepthStencil = &depthStencil; var _rangeCount = ranges?.Count ?? 0; var _pRanges = ranges.MarshalDirect(ref unmanaged); Direct.CmdClearDepthStencilImage(_commandBuffer, _image, _imageLayout, _pDepthStencil, _rangeCount, _pRanges); } }