public unsafe void CmdBeginRenderPass(ref VkRenderPassBeginInfo renderPassBegin, VkSubpassContents contents) { VkRenderPassBeginInfo_Native renderPassBegin_native = new VkRenderPassBeginInfo_Native(); renderPassBegin_native.pNext = new IntPtr(0); renderPassBegin_native.sType = VkStructureType.VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; if (renderPassBegin.clearValues == null || renderPassBegin.clearValues.Length == 0) { renderPassBegin_native.clearValueCount = 0; } else { renderPassBegin_native.clearValueCount = (uint)renderPassBegin.clearValues.Length; renderPassBegin_native.pClearValues = System.Runtime.InteropServices.Marshal.AllocHGlobal(new IntPtr(sizeof(UInt32) * 4 * renderPassBegin_native.clearValueCount)); } renderPassBegin_native.framebufferHandle = renderPassBegin.framebuffer._Handle; renderPassBegin_native.renderArea = renderPassBegin.renderArea; renderPassBegin_native.renderPassHandle = renderPassBegin.renderPass._Handle; for (int n = 0; n < renderPassBegin_native.clearValueCount; n++) { if (renderPassBegin.clearValues[n] is VkClearValue.VkClearColorValue.Float) { VkClearValue.VkClearColorValue.Float value = renderPassBegin.clearValues[n] as VkClearValue.VkClearColorValue.Float; float *pValue = ((float *)(renderPassBegin_native.pClearValues.ToPointer()) + (n * 4)); pValue[0] = value.float32[0]; pValue[1] = value.float32[1]; pValue[2] = value.float32[2]; pValue[3] = value.float32[3]; } else if (renderPassBegin.clearValues[n] is VkClearValue.VkClearColorValue.Int32_t) { VkClearValue.VkClearColorValue.Int32_t value = renderPassBegin.clearValues[n] as VkClearValue.VkClearColorValue.Int32_t; Int32 *pValue = ((Int32 *)(renderPassBegin_native.pClearValues.ToPointer()) + (n * 4)); pValue[0] = value.int32[0]; pValue[1] = value.int32[1]; pValue[2] = value.int32[2]; pValue[3] = value.int32[3]; } else if (renderPassBegin.clearValues[n] is VkClearValue.VkClearColorValue.UInt32_t) { VkClearValue.VkClearColorValue.UInt32_t value = renderPassBegin.clearValues[n] as VkClearValue.VkClearColorValue.UInt32_t; UInt32 *pValue = ((UInt32 *)(renderPassBegin_native.pClearValues.ToPointer()) + (n * 4)); pValue[0] = value.uint32[0]; pValue[1] = value.uint32[1]; pValue[2] = value.uint32[2]; pValue[3] = value.uint32[3]; } else if (renderPassBegin.clearValues[n] is VkClearValue.VkClearDepthStencilValue.VkClearDepthStencilValue) { VkClearValue.VkClearDepthStencilValue.VkClearDepthStencilValue value = renderPassBegin.clearValues[n] as VkClearValue.VkClearDepthStencilValue.VkClearDepthStencilValue; *((float *)(renderPassBegin_native.pClearValues.ToPointer()) + (n * 4)) = value.depth; *((UInt32 *)(renderPassBegin_native.pClearValues.ToPointer()) + (n * 4 + 1)) = value.stencil; } } _Parent.Device.vkCmdBeginRenderPass(_Handle, new IntPtr(&renderPassBegin_native), contents); System.Runtime.InteropServices.Marshal.FreeHGlobal(renderPassBegin_native.pClearValues); }
public void CmdClearColorImage(VkImage Image, VkImageLayout ImageLayout, float R, float G, float B, float A, VkImageSubresourceRange[] Ranges) { VkClearValue.VkClearColorValue.Float color = new VkClearValue.VkClearColorValue.Float(); color.float32 = new float[4]; color.float32[0] = R; color.float32[1] = G; color.float32[2] = B; color.float32[3] = A; CmdClearColorImage(Image, ImageLayout, ref color, Ranges); }
public unsafe void CmdClearColorImage(VkImage Image, VkImageLayout ImageLayout, ref VkClearValue.VkClearColorValue.Float color, VkImageSubresourceRange[] Ranges) { VkClearValue.VkClearColorValue.Float_s color_native = new VkClearValue.VkClearColorValue.Float_s(); color_native.float32 = color.float32; if (Ranges == null || Ranges.Length == 0) { throw new Exception("There must be at least one range"); } fixed(VkImageSubresourceRange *pRange = &Ranges[0]) { _Parent.Device.vkCmdClearColorImage_Float(_Handle, Image._Handle, ImageLayout, ref color_native, (uint)Ranges.Length, new IntPtr(pRange)); } }
public Triangle() { InitializeComponent(); InitializeVulkan(); _Bitmap = new Bitmap(640, 480); _Framebuffer = new Framebuffer(_Device, 640, 480); VkPipelineLayout dummyLayout = _Device.CreatePipelineLayout(VkPipelineLayoutCreateFlag.NONE, null, null); _VertexShader = _Device.CreateShaderModule(VkShaderModuleCreateFlag.NONE, System.IO.File.ReadAllBytes("./Shaders/vertexShader.spv")); _FramgemtShader = _Device.CreateShaderModule(VkShaderModuleCreateFlag.NONE, System.IO.File.ReadAllBytes("./Shaders/fragmentShader.spv")); _GraphicsPipeline = new Pipeline(_Framebuffer, dummyLayout, _VertexShader, "main", _FramgemtShader, "main"); // Finally we will need a fence for our submission in order to wait on it _Fence = _Device.CreateFence(VkFenceCreateFlag.NONE); // VkBuffer indexBuffer = _Device.CreateBuffer(0, 3 * sizeof(Int32), VkBufferUsageFlag.VK_BUFFER_USAGE_INDEX_BUFFER, VkSharingMode.VK_SHARING_MODE_CONCURRENT, new VkQueueFamilyProperties[] { _Queue.Family }); // VkBuffer vertexBuffer = _Device.CreateBuffer(0, 3 * sizeof(float), VkBufferUsageFlag.VK_BUFFER_USAGE_VERTEX_BUFFER, VkSharingMode.VK_SHARING_MODE_CONCURRENT, new VkQueueFamilyProperties[] { _Queue.Family }); // Now we need to create a command buffer and we will fill it with a single command: // Fill the image with the color (0.1f, 0.75f, 1.0f, 1.0f) which is a Sky blue. VkClearValue.VkClearColorValue.Float color = new VkClearValue.VkClearColorValue.Float(); color.float32[0] = 0.1f; color.float32[1] = 0.75f; color.float32[2] = 1.0f; color.float32[3] = 1.0f; VkCommandPool Pool = _Device.CreateCommandPool(VkCommandPoolCreateFlag.NONE, _Queue.Family); _CommandBuffer = Pool.AllocateCommandBuffer(VkCommandBufferLevel.VK_COMMAND_BUFFER_LEVEL_PRIMARY); _CommandBuffer.Begin(VkCommandBufferUsageFlag.NONE); _CommandBuffer.CmdBeginRenderPass(_Framebuffer.RenderPass, new VkRect2D(0, 0, (uint)640, (uint)480), _Framebuffer.GetFramebuffer(), new VkClearValue[] { color }, VkSubpassContents.VK_SUBPASS_CONTENTS_INLINE); _GraphicsPipeline.BindPipeline(_CommandBuffer); _CommandBuffer.CmdDraw(3, 1, 0, 0); _CommandBuffer.CmdEndRenderPass(); _CommandBuffer.cmdCopyImageToBuffer(_Framebuffer.FrameBufferColor, VkImageLayout.VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, _Framebuffer._TransferBuffer, new VkBufferImageCopy[] { new VkBufferImageCopy() { bufferImageHeight = (uint)_Framebuffer.Height, bufferOffset = 0, bufferRowLength = (uint)_Framebuffer.Width, imageExtent = new VkExtent3D() { depth = 1, width = (uint)_Framebuffer.Width, height = (uint)_Framebuffer.Height }, imageSubresource = new VkImageSubresourceLayers() { aspectMask = VkImageAspectFlag.VK_IMAGE_ASPECT_COLOR_BIT, baseArrayLayer = 0, layerCount = 1, mipLevel = 0 } } }); _CommandBuffer.End(); }