metal/learn_metal/00-window macOS

Code

00-window.odin ¶
102 linesSource

1package main
2
3import NS  "core:sys/darwin/Foundation"
4import MTL "vendor:darwin/Metal"
5import CA  "vendor:darwin/QuartzCore"
6
7import SDL "vendor:sdl2"
8
9import "core:fmt"
10import "core:os"
11
12metal_main :: proc() -> (err: ^NS.Error) {
13	SDL.SetHint(SDL.HINT_RENDER_DRIVER, "metal")
14	SDL.setenv("METAL_DEVICE_WRAPPER_TYPE", "1", 0)
15	SDL.Init({.VIDEO})
16	defer SDL.Quit()
17
18	window := SDL.CreateWindow("Metal in Odin - 00 window",
19		SDL.WINDOWPOS_CENTERED, SDL.WINDOWPOS_CENTERED,
20		854, 480,
21		{.ALLOW_HIGHDPI, .HIDDEN, .RESIZABLE},
22	)
23	defer SDL.DestroyWindow(window)
24
25	window_system_info: SDL.SysWMinfo
26	SDL.GetVersion(&window_system_info.version)
27	SDL.GetWindowWMInfo(window, &window_system_info)
28	assert(window_system_info.subsystem == .COCOA)
29
30	native_window := (^NS.Window)(window_system_info.info.cocoa.window)
31
32	device := MTL.CreateSystemDefaultDevice()
33	defer device->release()
34
35	fmt.println(device->name()->odinString())
36
37	swapchain := CA.MetalLayer.layer()
38	defer swapchain->release()
39
40	swapchain->setDevice(device)
41	swapchain->setPixelFormat(.BGRA8Unorm_sRGB)
42	swapchain->setFramebufferOnly(true)
43	swapchain->setFrame(native_window->frame())
44
45	native_window->contentView()->setLayer(swapchain)
46	native_window->setOpaque(true)
47	native_window->setBackgroundColor(nil)
48
49	command_queue := device->newCommandQueue()
50	defer command_queue->release()
51
52	SDL.ShowWindow(window)
53	for quit := false; !quit;  {
54		for e: SDL.Event; SDL.PollEvent(&e); {
55			#partial switch e.type {
56			case .QUIT:
57				quit = true
58			case .KEYDOWN:
59				if e.key.keysym.sym == .ESCAPE {
60					quit = true
61				}
62			}
63		}
64
65
66		drawable := swapchain->nextDrawable()
67		assert(drawable != nil)
68		defer drawable->release()
69
70		pass := MTL.RenderPassDescriptor.renderPassDescriptor()
71		defer pass->release()
72
73		color_attachment := pass->colorAttachments()->object(0)
74		assert(color_attachment != nil)
75		color_attachment->setClearColor(MTL.ClearColor{0.25, 0.5, 1.0, 1.0})
76		color_attachment->setLoadAction(.Clear)
77		color_attachment->setStoreAction(.Store)
78		color_attachment->setTexture(drawable->texture())
79
80
81		command_buffer := command_queue->commandBuffer()
82		defer command_buffer->release()
83
84		render_encoder := command_buffer->renderCommandEncoderWithDescriptor(pass)
85		defer render_encoder->release()
86
87		render_encoder->endEncoding()
88
89		command_buffer->presentDrawable(drawable)
90		command_buffer->commit()
91	}
92
93	return nil
94}
95
96main :: proc() {
97	err := metal_main()
98	if err != nil {
99		fmt.eprintln(err->localizedDescription()->odinString())
100		os.exit(1)
101	}
102}

Declarations Used 23