Beispiel #1
0
        public static GRVkExtensions Create(GRVkGetProcedureAddressDelegate getProc, IntPtr vkInstance, IntPtr vkPhysicalDevice, string[] instanceExtensions, string[] deviceExtensions)
        {
            var extensions = new GRVkExtensions();

            extensions.Initialize(getProc, vkInstance, vkPhysicalDevice, instanceExtensions, deviceExtensions);
            return(extensions);
        }
Beispiel #2
0
        public void Initialize(GRVkGetProcedureAddressDelegate getProc, IntPtr vkInstance, IntPtr vkPhysicalDevice, string[] instanceExtensions, string[] deviceExtensions)
        {
            var proxy = DelegateProxies.Create(getProc, DelegateProxies.GRVkGetProcDelegateProxy, out var gch, out var ctx);

            try {
                var ie = instanceExtensions;
                var de = deviceExtensions;
                SkiaApi.gr_vk_extensions_init(Handle, proxy, (void *)ctx, vkInstance, vkPhysicalDevice, (uint)(ie?.Length ?? 0), ie, (uint)(de?.Length ?? 0), de);
            } finally {
                gch.Free();
            }
        }
Beispiel #3
0
        public static void Initialize(this GRVkExtensions extensions, GRSharpVkGetProcedureAddressDelegate getProc, Instance instance, PhysicalDevice physicalDevice, string[] instanceExtensions, string[] deviceExtensions)
        {
            GRVkGetProcedureAddressDelegate proc = (name, inst, _) =>
            {
                if (inst != IntPtr.Zero && instance?.RawHandle.ToUInt64() != (ulong)inst.ToInt64())
                {
                    throw new InvalidOperationException("Incorrect object for VkInstance.");
                }

                return(getProc?.Invoke(name, inst != IntPtr.Zero ? instance : null, null) ?? IntPtr.Zero);
            };

            extensions.Initialize(proc, (IntPtr)instance?.RawHandle.ToUInt64(), (IntPtr)physicalDevice?.RawHandle.ToUInt64(), instanceExtensions, deviceExtensions);
        }
Beispiel #4
0
        private void Initialize()
        {
            GRVkGetProcedureAddressDelegate getProc = GetVulkanProcAddress;

            _grVkBackend = new GRVkBackendContext()
            {
                VkInstance          = _surface.Device.Handle,
                VkPhysicalDevice    = _vulkanPlatformInterface.PhysicalDevice.Handle,
                VkDevice            = _surface.Device.Handle,
                VkQueue             = _surface.Device.Queue.Handle,
                GraphicsQueueIndex  = _vulkanPlatformInterface.PhysicalDevice.QueueFamilyIndex,
                GetProcedureAddress = getProc
            };

            GrContext = GRContext.CreateVulkan(_grVkBackend);

            var gpu = AvaloniaLocator.Current.GetService <VulkanSkiaGpu>();

            if (gpu.MaxResourceBytes.HasValue)
            {
                GrContext.SetResourceCacheLimit(gpu.MaxResourceBytes.Value);
            }
        }
Beispiel #5
0
 public void Initialize(GRVkGetProcedureAddressDelegate getProc, IntPtr vkInstance, IntPtr vkPhysicalDevice) =>
 Initialize(getProc, vkInstance, vkPhysicalDevice, null, null);