Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
        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));
            }
        }
Ejemplo n.º 4
0
        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();
        }