123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- // SPDX-License-Identifier: Unlicense OR MIT
- package driver
- import (
- "fmt"
- "unsafe"
- "gioui.org/internal/gl"
- )
- // See gpu/api.go for documentation for the API types.
- type API interface {
- implementsAPI()
- }
- type RenderTarget interface {
- ImplementsRenderTarget()
- }
- type OpenGLRenderTarget gl.Framebuffer
- type Direct3D11RenderTarget struct {
- // RenderTarget is a *ID3D11RenderTargetView.
- RenderTarget unsafe.Pointer
- }
- type MetalRenderTarget struct {
- // Texture is a MTLTexture.
- Texture uintptr
- }
- type VulkanRenderTarget struct {
- // WaitSem is a VkSemaphore that must signaled before accessing Framebuffer.
- WaitSem uint64
- // SignalSem is a VkSemaphore that signal access to Framebuffer is complete.
- SignalSem uint64
- // Fence is a VkFence that is set when all commands to Framebuffer has completed.
- Fence uint64
- // Image is the VkImage to render into.
- Image uint64
- // Framebuffer is a VkFramebuffer for Image.
- Framebuffer uint64
- }
- type OpenGL struct {
- // ES forces the use of ANGLE OpenGL ES libraries on macOS. It is
- // ignored on all other platforms.
- ES bool
- // Context contains the WebGL context for WebAssembly platforms. It is
- // empty for all other platforms; an OpenGL context is assumed current when
- // calling NewDevice.
- Context gl.Context
- // Shared instructs users of the context to restore the GL state after
- // use.
- Shared bool
- }
- type Direct3D11 struct {
- // Device contains a *ID3D11Device.
- Device unsafe.Pointer
- }
- type Metal struct {
- // Device is an MTLDevice.
- Device uintptr
- // Queue is a MTLCommandQueue.
- Queue uintptr
- // PixelFormat is the MTLPixelFormat of the default framebuffer.
- PixelFormat int
- }
- type Vulkan struct {
- // PhysDevice is a VkPhysicalDevice.
- PhysDevice unsafe.Pointer
- // Device is a VkDevice.
- Device unsafe.Pointer
- // QueueFamily is the queue familily index of the queue.
- QueueFamily int
- // QueueIndex is the logical queue index of the queue.
- QueueIndex int
- // Format is a VkFormat that matches render targets.
- Format int
- }
- // API specific device constructors.
- var (
- NewOpenGLDevice func(api OpenGL) (Device, error)
- NewDirect3D11Device func(api Direct3D11) (Device, error)
- NewMetalDevice func(api Metal) (Device, error)
- NewVulkanDevice func(api Vulkan) (Device, error)
- )
- // NewDevice creates a new Device given the api.
- //
- // Note that the device does not assume ownership of the resources contained in
- // api; the caller must ensure the resources are valid until the device is
- // released.
- func NewDevice(api API) (Device, error) {
- switch api := api.(type) {
- case OpenGL:
- if NewOpenGLDevice != nil {
- return NewOpenGLDevice(api)
- }
- case Direct3D11:
- if NewDirect3D11Device != nil {
- return NewDirect3D11Device(api)
- }
- case Metal:
- if NewMetalDevice != nil {
- return NewMetalDevice(api)
- }
- case Vulkan:
- if NewVulkanDevice != nil {
- return NewVulkanDevice(api)
- }
- }
- return nil, fmt.Errorf("driver: no driver available for the API %T", api)
- }
- func (OpenGL) implementsAPI() {}
- func (Direct3D11) implementsAPI() {}
- func (Metal) implementsAPI() {}
- func (Vulkan) implementsAPI() {}
- func (OpenGLRenderTarget) ImplementsRenderTarget() {}
- func (Direct3D11RenderTarget) ImplementsRenderTarget() {}
- func (MetalRenderTarget) ImplementsRenderTarget() {}
- func (VulkanRenderTarget) ImplementsRenderTarget() {}
|