Esempio n. 1
0
        static IntPtr ExtractImageBinds(List <IntPtr> attachedItems, MgSparseImageMemoryBindInfo[] imageBinds, out uint imageBindCount)
        {
            var  dest  = IntPtr.Zero;
            uint count = 0U;

            if (imageBinds != null)
            {
                count = (uint)imageBinds.Length;
                if (count > 0)
                {
                    dest = VkInteropsUtility.AllocateNestedHGlobalArray(
                        attachedItems,
                        imageBinds,
                        (items, bind) =>
                    {
                        var bImage = (VkImage)bind.Image;
                        Debug.Assert(bImage != null);

                        Debug.Assert(bind.Binds != null);
                        var bindCount = (uint)bind.Binds.Length;

                        var pBinds = VkInteropsUtility.AllocateHGlobalArray(
                            bind.Binds,
                            (arg) =>
                        {
                            var bDeviceMemory = (VkDeviceMemory)arg.Memory;
                            Debug.Assert(bDeviceMemory != null);

                            return(new VkSparseImageMemoryBind
                            {
                                subresource = new VkImageSubresource
                                {
                                    aspectMask = (VkImageAspectFlags)arg.Subresource.AspectMask,
                                    arrayLayer = arg.Subresource.ArrayLayer,
                                    mipLevel = arg.Subresource.MipLevel,
                                },
                                offset = arg.Offset,
                                extent = arg.Extent,
                                memory = bDeviceMemory.Handle,
                                memoryOffset = arg.MemoryOffset,
                                flags = (VkSparseMemoryBindFlags)arg.Flags,
                            });
                        });
                        items.Add(pBinds);

                        return(new VkSparseImageMemoryBindInfo
                        {
                            image = bImage.Handle,
                            bindCount = bindCount,
                            pBinds = pBinds,
                        });
                    });

                    attachedItems.Add(dest);
                }
            }

            imageBindCount = count;
            return(dest);
        }
Esempio n. 2
0
        static IntPtr ExtractBufferBinds(List <IntPtr> attachedItems, MgSparseBufferMemoryBindInfo[] bufferBinds, out uint bufferBindCount)
        {
            var  dest  = IntPtr.Zero;
            uint count = 0U;

            if (bufferBinds != null)
            {
                count = (uint)bufferBinds.Length;
                if (count > 0)
                {
                    dest = VkInteropsUtility.AllocateNestedHGlobalArray(
                        attachedItems,
                        bufferBinds,
                        (items, bind) =>
                    {
                        var bBuffer = (VkBuffer)bind.Buffer;
                        Debug.Assert(bBuffer != null);

                        Debug.Assert(bind.Binds != null);
                        var bindCount = (uint)bind.Binds.Length;
                        var pBinds    = VkInteropsUtility.AllocateHGlobalArray(
                            bind.Binds,
                            (arg) =>
                        {
                            var bDeviceMemory = (VkDeviceMemory)arg.Memory;
                            Debug.Assert(bDeviceMemory != null);

                            return(new VkSparseMemoryBind
                            {
                                resourceOffset = arg.ResourceOffset,
                                size = arg.Size,
                                memory = bDeviceMemory.Handle,
                                memoryOffset = arg.MemoryOffset,
                                flags = (VkSparseMemoryBindFlags)arg.Flags,
                            });
                        });
                        items.Add(pBinds);

                        return(new VkSparseBufferMemoryBindInfo
                        {
                            buffer = bBuffer.Handle,
                            bindCount = bindCount,
                            pBinds = pBinds,
                        });
                    }
                        );
                    attachedItems.Add(dest);
                }
            }

            bufferBindCount = count;
            return(dest);
        }