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, uint R, uint G, uint B, uint A, VkImageSubresourceRange[] Ranges) { VkClearValue.VkClearColorValue.UInt32_t color = new VkClearValue.VkClearColorValue.UInt32_t(); color.uint32 = new uint[4]; color.uint32[0] = R; color.uint32[1] = G; color.uint32[2] = B; color.uint32[3] = A; CmdClearColorImage(Image, ImageLayout, ref color, Ranges); }
public unsafe void CmdClearColorImage(VkImage Image, VkImageLayout ImageLayout, ref VkClearValue.VkClearColorValue.UInt32_t color, VkImageSubresourceRange[] Ranges) { VkClearValue.VkClearColorValue.UInt32_t_s color_native = new VkClearValue.VkClearColorValue.UInt32_t_s(); color_native.uint32 = color.uint32; if (Ranges == null || Ranges.Length == 0) { throw new Exception("There must be at least one range"); } fixed(VkImageSubresourceRange *pRange = &Ranges[0]) { _Parent.Device.vkCmdClearColorImage_UInt32(_Handle, Image._Handle, ImageLayout, ref color_native, (uint)Ranges.Length, new IntPtr(pRange)); } }