gioui.org@v0.6.1-0.20240506124620-7a9ce51988ce/gpu/headless/headless_vulkan.go (about)

     1  // SPDX-License-Identifier: Unlicense OR MIT
     2  
     3  //go:build (linux || freebsd) && !novulkan
     4  // +build linux freebsd
     5  // +build !novulkan
     6  
     7  package headless
     8  
     9  import (
    10  	"unsafe"
    11  
    12  	"gioui.org/gpu"
    13  	"gioui.org/internal/vk"
    14  )
    15  
    16  type vkContext struct {
    17  	physDev  vk.PhysicalDevice
    18  	inst     vk.Instance
    19  	dev      vk.Device
    20  	queueFam int
    21  }
    22  
    23  func init() {
    24  	newContextFallback = newVulkanContext
    25  }
    26  
    27  func newVulkanContext() (context, error) {
    28  	inst, err := vk.CreateInstance()
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  	physDev, qFam, err := vk.ChoosePhysicalDevice(inst, 0)
    33  	if err != nil {
    34  		vk.DestroyInstance(inst)
    35  		return nil, err
    36  	}
    37  	dev, err := vk.CreateDeviceAndQueue(physDev, qFam)
    38  	if err != nil {
    39  		vk.DestroyInstance(inst)
    40  		return nil, err
    41  	}
    42  	ctx := &vkContext{
    43  		physDev:  physDev,
    44  		inst:     inst,
    45  		dev:      dev,
    46  		queueFam: qFam,
    47  	}
    48  	return ctx, nil
    49  }
    50  
    51  func (c *vkContext) API() gpu.API {
    52  	return gpu.Vulkan{
    53  		PhysDevice:  unsafe.Pointer(c.physDev),
    54  		Device:      unsafe.Pointer(c.dev),
    55  		Format:      int(vk.FORMAT_R8G8B8A8_SRGB),
    56  		QueueFamily: c.queueFam,
    57  		QueueIndex:  0,
    58  	}
    59  }
    60  
    61  func (c *vkContext) MakeCurrent() error {
    62  	return nil
    63  }
    64  
    65  func (c *vkContext) ReleaseCurrent() {
    66  }
    67  
    68  func (c *vkContext) Release() {
    69  	vk.DeviceWaitIdle(c.dev)
    70  
    71  	vk.DestroyDevice(c.dev)
    72  	vk.DestroyInstance(c.inst)
    73  	*c = vkContext{}
    74  }