main 5d6fa26

alloc.go RawHistoryFolder

1package drm
2
3import (
4	"github.com/bnema/neferwl/internal/adapters/drm/gbm"
5	"github.com/bnema/neferwl/internal/ports"
6)
7
8// imageAllocator makes the output images with the display driver's own
9// allocator (GBM), which knows the layouts the driver scans out correctly:
10// images allocated by the renderer show corrupted on NVIDIA. One per
11// output, used by its goroutine only.
12type imageAllocator interface {
13	// create allocates an image whose modifier is one of modifiers.
14	create(width, height int, format uint32, modifiers []uint64) (imageBuffer, error)
15	close()
16}
17
18// imageBuffer is one allocated image, kept alive while it is shown.
19type imageBuffer interface {
20	// dmabuf returns the image with fresh descriptors the caller closes.
21	dmabuf() (ports.DMABuf, error)
22	close()
23}
24
25// gbmAllocator allocates scanout-capable, renderable images with libgbm.
26type gbmAllocator struct{ dev *gbm.Device }
27
28// openGBM opens a GBM allocator on a duplicate of the card fd.
29func openGBM(fd int) (imageAllocator, error) {
30	dev, err := gbm.Open(fd)
31	if err != nil {
32		return nil, err
33	}
34	return gbmAllocator{dev}, nil
35}
36
37func (a gbmAllocator) create(width, height int, format uint32, modifiers []uint64) (imageBuffer, error) {
38	b, err := a.dev.Create(width, height, format, modifiers, gbm.UseScanout|gbm.UseRendering)
39	if err != nil {
40		return nil, err
41	}
42	return gbmImage{b}, nil
43}
44
45func (a gbmAllocator) close() { a.dev.Close() }
46
47type gbmImage struct{ b *gbm.Buffer }
48
49func (i gbmImage) dmabuf() (ports.DMABuf, error) { return i.b.DMABuf() }
50func (i gbmImage) close()                        { i.b.Close() }

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 23

Tags 10

↑↓ moveenter openesc close