gl

package
v0.0.0-...-7a819e8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 24, 2019 License: BSD-2-Clause Imports: 13 Imported by: 0

Documentation

Overview

Package gl provides simple abstractions over a modern subset of OpenGL.

Index

Constants

This section is empty.

Variables

View Source
var DefaultFramebuffer = Framebuffer{
	// contains filtered or unexported fields
}

Functions

func BindComputeSubroutines

func BindComputeSubroutines(s []uint32)

BindComputeSubroutines binds the compute shader subroutines to indices in s.

func BindFragmentSubroutines

func BindFragmentSubroutines(s []uint32)

BindFragmentSubroutines binds the fragment shader subroutines to indices in s.

func BindGeometrySubroutines

func BindGeometrySubroutines(s []uint32)

BindGeometrySubroutines binds the geometry shader subroutines to indices in s.

func BindTessControlSubroutines

func BindTessControlSubroutines(s []uint32)

BindTessControlSubroutines binds the tesselation control shader subroutines to indices in s.

func BindTessEvaluationSubroutines

func BindTessEvaluationSubroutines(s []uint32)

BindTessEvaluationSubroutines binds the tesselation evaluation shader subroutines to indices in s.

func BindVertexSubroutines

func BindVertexSubroutines(s []uint32)

BindVertexSubroutines binds the vertex shader subroutines to indices in s.

func Blending

func Blending(src, dst BlendFactor)

Blending specifies the formula used for blending pixels.

Note that you must also `Enable(Blend)`. The default values are `One` and `Zero`. For alpha-blending and antialiasing, the most useful choice is `Blending(SrcAlpha, OneMinusSrcAlpha)`.

func ClearColorBuffer

func ClearColorBuffer(c struct{ R, G, B, A float32 })

ClearColorBuffer clears the color buffer with c.

func ClearDepthBuffer

func ClearDepthBuffer(d float32)

ClearDepthBuffer clears the depth buffer with d.

func ClearStencilBuffer

func ClearStencilBuffer(m int32)

ClearStencilBuffer clears the stencil buffer with m.

func DepthRange

func DepthRange(near, far float64)

DepthRange specifies the mapping of depth values from normalized device coordinates to window coordinates.

func Disable

func Disable(c Capability)

Disable an OpenGL Capability

func Draw

func Draw(first int32, count int32)

Draw asks the GPU to draw a sequence of primitives.

func DrawIndexed

func DrawIndexed(first int32, count int32)

DrawIndexed asks the GPU to draw a sequence of primitives with indexed vertices.

func DrawIndirect

func DrawIndirect(firstdraw uintptr, drawcount int32)

DrawIndirect asks the GPU to read the Indirect Buffer starting at firstdraw, and make drawcount draw calls.

func DrawInstanced

func DrawInstanced(first int32, count int32, instances int32)

DrawInstanced asks the GPU to draw several instances of a sequence of primitives.

func Enable

func Enable(c Capability)

Enable an OpenGL Capability

func Err

func Err() error

Err returns the first OpenGL error since the previous call to Err().

func PointSize

func PointSize(s float32)

PointSize sets the size used when drawing points.

func Setup

func Setup(dbg bool) error

Setup is called by carol.Run, and should not be called manually.

func Viewport

func Viewport(ox, oy, width, height int32)

Viewport sets the size in pixels of the GL viewport.

Note that this function is automatically called each time the window is resized.

Types

type BlendFactor

type BlendFactor C.GLenum

A BlendFactor is a formula used when blending pixels.

Used in `Blending`.

type BufferFlags

type BufferFlags C.GLbitfield

BufferFlags specifiy which settings to use when creating a new buffer. Values can be ORed together.

const (
	StaticStorage  BufferFlags = C.GL_NONE                // Content will not be updated
	MapRead        BufferFlags = C.GL_MAP_READ_BIT        // Data store will be mapped for reading
	MapWrite       BufferFlags = C.GL_MAP_WRITE_BIT       // Data store will be mapped for writing
	MapPersistent  BufferFlags = C.GL_MAP_PERSISTENT_BIT  // Data store will be accessed by both application and GPU while mapped
	MapCoherent    BufferFlags = C.GL_MAP_COHERENT_BIT    // No synchronization needed when persistently mapped
	DynamicStorage BufferFlags = C.GL_DYNAMIC_STORAGE_BIT // Content will be updated
	ClientStorage  BufferFlags = C.GL_CLIENT_STORAGE_BIT  // Prefer storage on application side
)

Used in `NewUniformBuffer` and `NewVertexBuffer`.

type BufferMask

type BufferMask C.GLbitfield
const (
	ColorBufferBit   BufferMask = C.GL_COLOR_BUFFER_BIT
	DepthBufferBit   BufferMask = C.GL_DEPTH_BUFFER_BIT
	StencilBufferBit BufferMask = C.GL_STENCIL_BUFFER_BIT
)

type BufferTexture

type BufferTexture struct {
	// contains filtered or unexported fields
}

func NewBufferTexture

func NewBufferTexture(data interface{}, fmt TextureFormat, f BufferFlags) BufferTexture

func (BufferTexture) Bind

func (bt BufferTexture) Bind(index uint32)

Bind the buffer texture.

func (*BufferTexture) Delete

func (tb *BufferTexture) Delete()

Delete frees the buffer.

type Capability

type Capability C.GLenum

A Capability is an OpenGL functionality that can be enabled or disabled.

const (
	Blend                  Capability = C.GL_BLEND
	ColorLogicOp           Capability = C.GL_COLOR_LOGIC_OP
	DebugOutput            Capability = C.GL_DEBUG_OUTPUT
	DebugOutputSynchronous Capability = C.GL_DEBUG_OUTPUT_SYNCHRONOUS
	Dither                 Capability = C.GL_DITHER
	FramebufferSRGB        Capability = C.GL_FRAMEBUFFER_SRGB
	LineSmooth             Capability = C.GL_LINE_SMOOTH
	Multisample            Capability = C.GL_MULTISAMPLE
	SampleAlphaToCoverage  Capability = C.GL_SAMPLE_ALPHA_TO_COVERAGE
	SampleAlphaToOne       Capability = C.GL_SAMPLE_ALPHA_TO_ONE
	SampleCoverage         Capability = C.GL_SAMPLE_COVERAGE
	SampleShading          Capability = C.GL_SAMPLE_SHADING
	SampleMask             Capability = C.GL_SAMPLE_MASK
	ScissorTest            Capability = C.GL_SCISSOR_TEST
	TextureCubeMapSeamless Capability = C.GL_TEXTURE_CUBE_MAP_SEAMLESS
)

Used in `Enable` and `Disable`.

type ComparisonOp

type ComparisonOp C.GLuint

A ComparisonOp specifies an operator for depth texture comparison.

const (
	LessOrEqual    ComparisonOp = C.GL_LEQUAL
	GreaterOrEqual ComparisonOp = C.GL_GEQUAL
	Less           ComparisonOp = C.GL_LESS
	Greater        ComparisonOp = C.GL_GREATER
	Equal          ComparisonOp = C.GL_EQUAL
	NotEqual       ComparisonOp = C.GL_NOTEQUAL
	Always         ComparisonOp = C.GL_ALWAYS
	Never          ComparisonOp = C.GL_NEVER
)

Used in `Sampler.Comparison` and `DepthComparison`.

type DrawIndirectCommand

type DrawIndirectCommand struct {
	VertexCount   uint32
	InstanceCount uint32
	FirstVertex   uint32
	BaseInstance  uint32
}

A DrawIndirectCommand describes a single draw call. A slice of these is used to fill indirect buffers.

type FilterMode

type FilterMode C.GLuint

A FilterMode specifies how to filter textures when minifying or magnifying.

const (
	Nearest             FilterMode = C.GL_NEAREST
	Linear              FilterMode = C.GL_LINEAR
	NearestMimapNearest FilterMode = C.GL_NEAREST_MIPMAP_NEAREST
	LinearMipmapNearest FilterMode = C.GL_LINEAR_MIPMAP_NEAREST
	NearestMipmapLinear FilterMode = C.GL_NEAREST_MIPMAP_LINEAR
	LinearMipmapLinear  FilterMode = C.GL_LINEAR_MIPMAP_LINEAR
)

Used in `Sampler.Minification` and `Sampler.Magnification` (only `Nearest` and `Linear` are valid for magnification).

type Framebuffer

type Framebuffer struct {
	// contains filtered or unexported fields
}

func NewFramebuffer

func NewFramebuffer() Framebuffer

func (Framebuffer) Bind

func (fb Framebuffer) Bind(t FramebufferTarget)

func (Framebuffer) Blit

func (fb Framebuffer) Blit(dst Framebuffer, srcX1, srcY1, srcX2, srcY2, dstX1, dstY1, dstX2, dstY2 int32, m BufferMask, f FilterMode)

func (Framebuffer) DrawBuffer

func (fb Framebuffer) DrawBuffer(a FramebufferAttachment)

func (Framebuffer) Texture

func (fb Framebuffer) Texture(a FramebufferAttachment, t Texture2D, level int32)

type FramebufferTarget

type FramebufferTarget C.GLenum
const (
	DrawFramebuffer     FramebufferTarget = C.GL_DRAW_FRAMEBUFFER
	ReadFramebuffer     FramebufferTarget = C.GL_READ_FRAMEBUFFER
	DrawReadFramebuffer FramebufferTarget = C.GL_FRAMEBUFFER
)

type IndexBuffer

type IndexBuffer struct {
	// contains filtered or unexported fields
}

An IndexBuffer is a block of memory owned by the GPU, used to store vertex indices.

func NewIndexBuffer

func NewIndexBuffer(data interface{}, f BufferFlags) IndexBuffer

NewIndexBuffer asks the GPU to allocate a new block of memory.

If data is a uinptr, it is interpreted as the desired size for the buffer (in bytes), and the content is not initialized. Otherwise data must be a slice of uint8, uint16 or uin32. In all cases the size of the buffer is fixed at creation.

func (*IndexBuffer) Bind

func (eb *IndexBuffer) Bind()

Bind the element buffer.

func (*IndexBuffer) Delete

func (eb *IndexBuffer) Delete()

Delete frees the buffer.

func (*IndexBuffer) SubData

func (eb *IndexBuffer) SubData(data interface{}, atOffset uintptr)

SubData updates the buffer with data, starting at a specified offset.

It is your responsability to ensure that the size of data plus the offset does not exceed the buffer size.

type IndirectBuffer

type IndirectBuffer struct {
	// contains filtered or unexported fields
}

An IndirectBuffer is a block of memory owned by the GPU.

func NewIndirectBuffer

func NewIndirectBuffer(data interface{}, f BufferFlags) IndirectBuffer

NewIndirectBuffer asks the GPU to allocate a new block of memory.

If data is a

In all cases the size of the buffer is fixed at creation.

func (*IndirectBuffer) Bind

func (ib *IndirectBuffer) Bind()

Bind the indirect buffer.

The buffer should use the same struct type than the one used in the corresponding call to Pipeline.IndirectFormat.

func (*IndirectBuffer) Delete

func (ib *IndirectBuffer) Delete()

Delete frees the buffer.

func (*IndirectBuffer) SubData

func (ib *IndirectBuffer) SubData(data interface{}, atOffset uintptr)

SubData updates the buffer with data, starting at a specified offset.

It is your responsability to ensure that the size of data plus the offset does not exceed the buffer size.

type Pipeline

type Pipeline struct {
	// contains filtered or unexported fields
}

A Pipeline consists of shaders and state for the GPU.

func NewPipeline

func NewPipeline(o ...PipelineConfig) *Pipeline

NewPipeline returns a pipeline with created from a specific set of shaders.

func (*Pipeline) Bind

func (p *Pipeline) Bind()

Bind the pipeline for use by the GPU in all following draw commands.

func (*Pipeline) Close

func (p *Pipeline) Close()

Close the pipeline.

func (*Pipeline) Unbind

func (p *Pipeline) Unbind()

Unbind the pipeline.

type PipelineConfig

type PipelineConfig func(*Pipeline)

A PipelineConfig represents a configuration option used when creating a new pipeline.

func ComputeShader

func ComputeShader(r io.Reader) PipelineConfig

ComputeShader compiles a comput shader.

func CullFace

func CullFace(front, back bool) PipelineConfig

CullFace specifies if front and/or back faces are culled.

See also `FrontFace`.

func DepthClamp

func DepthClamp(enable bool) PipelineConfig

func DepthComparison

func DepthComparison(op ComparisonOp) PipelineConfig

DepthComparison specifies the function used to compare pixel depth.

Note that you must also `Enable(DepthTest)`. The default value is `Less`.

func DepthTest

func DepthTest(enable bool) PipelineConfig

func FragmentShader

func FragmentShader(r io.Reader) PipelineConfig

FragmentShader compiles a fragment shader.

func FrontFace

func FrontFace(d WindingDirection) PipelineConfig

FrontFace specifies which winding direction is considered front.

See also `CullFace`.

func GeometryShader

func GeometryShader(r io.Reader) PipelineConfig

GeometryShader compiles a geometry shader.

func PrimitiveRestart

func PrimitiveRestart(enable bool) PipelineConfig

func RasterizerDiscard

func RasterizerDiscard(enable bool) PipelineConfig

func Shader

func Shader(path string) PipelineConfig

Shader compiles a shader. The path is slash-separated, and the file extension determine the type of shader:

- ".vert" for a vertex shader - ".frag" for a fragment shader - ".comp" for a compute shader - ".geom" for a geometry shader - ".tesc" for a tesselation control shader - ".tese" for a tesselation evaluation shader

func ShareShadersWith

func ShareShadersWith(other *Pipeline) PipelineConfig

func ShareVertexFormatsWith

func ShareVertexFormatsWith(other *Pipeline) PipelineConfig

func StencilTest

func StencilTest(enable bool) PipelineConfig

func TessControlShader

func TessControlShader(r io.Reader) PipelineConfig

TessControlShader compiles a tesselation control shader.

func TessEvaluationShader

func TessEvaluationShader(r io.Reader) PipelineConfig

TessEvaluationShader compiles a tesselation evaluation shader.

func Topology

func Topology(m Primitive) PipelineConfig

func VertexFormat

func VertexFormat(binding uint32, format interface{}) PipelineConfig

VertexFormat prepares everything the pipeline needs to use a vertex buffer of a specific format, and assign a binding index to it.

The format must be a slice of struct, and the struct must have with layout tags.

func VertexShader

func VertexShader(r io.Reader) PipelineConfig

VertexShader compiles a vertex shader.

type Primitive

type Primitive C.GLenum

A Primitive specifies what kind of object to draw.

const (
	Points               Primitive = C.GL_POINTS
	Lines                Primitive = C.GL_LINES
	LineLoop             Primitive = C.GL_LINE_LOOP
	LineStrip            Primitive = C.GL_LINE_STRIP
	Triangles            Primitive = C.GL_TRIANGLES
	TriangleStrip        Primitive = C.GL_TRIANGLE_STRIP
	TriangleFan          Primitive = C.GL_TRIANGLE_FAN
	LinesAdjency         Primitive = C.GL_LINES_ADJACENCY
	LineStripAdjency     Primitive = C.GL_LINE_STRIP_ADJACENCY
	TrianglesAdjency     Primitive = C.GL_TRIANGLES_ADJACENCY
	TriangleStripAdjency Primitive = C.GL_TRIANGLE_STRIP_ADJACENCY
	Patches              Primitive = C.GL_PATCHES
)

Used in `Topology`.

type Sampler

type Sampler struct {
	// contains filtered or unexported fields
}

A Sampler describes a way to sample textures inside shaders.

func NewSampler

func NewSampler(o ...SamplerOption) Sampler

NewSampler returns a new sampler.

func (Sampler) Bind

func (sa Sampler) Bind(binding uint32)

Bind a sampler to a texture unit index.

type SamplerOption

type SamplerOption func(sa *Sampler)

A SamplerOption is a setting used when creating a new `Sampler`.

func Anisotropy

func Anisotropy(max float32) SamplerOption

Anisotropy specifies the maximum anisotropy level.

func BorderColor

func BorderColor(color struct{ R, G, B, A float32 }) SamplerOption

BorderColor sets the color used for texture filtering when ClampToborder wrapping mode is used.

func Comparison

func Comparison(op ComparisonOp) SamplerOption

Comparison specifies the mode and operator used when comparing depth textures.

func LevelOfDetail

func LevelOfDetail(min, max float32) SamplerOption

LevelOfDetail specifies the minimum and maximum LOD to use.

The default values are -1000 and 1000.

func Magnification

func Magnification(fm FilterMode) SamplerOption

Magnification specifies which filter is used when minifying the texture.

The default value is `Linear`.

func Minification

func Minification(fm FilterMode) SamplerOption

Minification specifies which filter is used when minifying the texture.

The default value is `NearestMipmapLinear`.

func Wrapping

func Wrapping(s, t, p WrapMode) SamplerOption

Wrapping sets the wrapping modes for texture coordinates.

The default value is `Repeat` for all coordinates.

type StorageBuffer

type StorageBuffer struct {
	// contains filtered or unexported fields
}

A StorageBuffer is a block of memory owned by the GPU.

func NewStorageBuffer

func NewStorageBuffer(data interface{}, f BufferFlags) StorageBuffer

NewStorageBuffer asks the GPU to allocate a new block of memory.

If data is a uinptr, it is interpreted as the desired size for the buffer (in bytes), and the content is not initialized. Otherwise data must be a pointer to a struct of pure values (no nested references). In all cases the size of the buffer is fixed at creation.

func (*StorageBuffer) Bind

func (sb *StorageBuffer) Bind(binding uint32)

Bind to a storage binding index.

This index should correspond to one indicated by a layout qualifier in the shaders.

func (*StorageBuffer) Delete

func (sb *StorageBuffer) Delete()

Delete frees the buffer.

func (*StorageBuffer) SubData

func (sb *StorageBuffer) SubData(data interface{}, atOffset uintptr)

SubData updates the buffer with data, starting at a specified offset.

It is your responsability to ensure that the size of data plus the offset does not exceed the buffer size.

type Texture1D

type Texture1D struct {
	// contains filtered or unexported fields
}

A Texture1D is a one-dimensional texture.

func NewTexture1D

func NewTexture1D(levels int32, f TextureFormat, width int32) Texture1D

NewTexture1D returns a new one-dimensional texture.

func (*Texture1D) Bind

func (t *Texture1D) Bind(index uint32)

Bind to a texture unit.

func (*Texture1D) GenerateMipmap

func (t *Texture1D) GenerateMipmap()

GenerateMipmap generates mipmaps for the texture.

func (*Texture1D) SubImage

func (t *Texture1D) SubImage(level int32, ox int32, img image.Image)

SubImage loads an image into a texture at a specific position offset and mipmap level.

type Texture2D

type Texture2D struct {
	// contains filtered or unexported fields
}

A Texture2D is a two-dimensional texture.

func NewTexture2D

func NewTexture2D(levels int32, f TextureFormat, width, height int32) Texture2D

NewTexture2D returns a new two-dimensional texture.

func (*Texture2D) Bind

func (t *Texture2D) Bind(index uint32)

Bind to a texture unit.

func (*Texture2D) GenerateMipmap

func (t *Texture2D) GenerateMipmap()

GenerateMipmap generates mipmaps for the texture.

func (*Texture2D) SubImage

func (t *Texture2D) SubImage(level int32, ox, oy int32, img image.Image)

SubImage loads an image into a texture at a specific position offset and mipmap level.

type Texture3D

type Texture3D struct {
	// contains filtered or unexported fields
}

A Texture3D is a three-dimensional texture.

func NewTexture3D

func NewTexture3D(levels int32, f TextureFormat, width, height, depth int32) Texture3D

NewTexture3D returns a new three-dimensional texture.

func (*Texture3D) Bind

func (t *Texture3D) Bind(index uint32)

Bind to a texture unit.

func (*Texture3D) GenerateMipmap

func (t *Texture3D) GenerateMipmap()

GenerateMipmap generates mipmaps for the texture.

func (*Texture3D) SubImage

func (t *Texture3D) SubImage(level int32, ox, oy, oz int32, img image.Image)

SubImage loads an image into a texture at a specific position offset and mipmap level.

type TextureArray1D

type TextureArray1D struct {
	// contains filtered or unexported fields
}

A TextureArray1D is an array of one-dimensional textures.

func NewTextureArray1D

func NewTextureArray1D(levels int32, f TextureFormat, width int32, count int32) TextureArray1D

NewTextureArray1D returns a new array of one-dimensional textures.

func (*TextureArray1D) Bind

func (t *TextureArray1D) Bind(index uint32)

Bind to a texture unit.

func (*TextureArray1D) GenerateMipmap

func (t *TextureArray1D) GenerateMipmap()

GenerateMipmap generates mipmaps for the texture.

func (*TextureArray1D) SubImage

func (t *TextureArray1D) SubImage(level int32, ox int32, index int32, img image.Image)

SubImage loads an image into a texture at a specific position offset, index and mipmap level.

type TextureArray2D

type TextureArray2D struct {
	// contains filtered or unexported fields
}

A TextureArray2D is an array of two-dimensional textures.

func NewTextureArray2D

func NewTextureArray2D(levels int32, f TextureFormat, width, height int32, count int32) TextureArray2D

NewTextureArray2D returns a new array of two-dimensional textures.

func (*TextureArray2D) Bind

func (t *TextureArray2D) Bind(index uint32)

Bind to a texture unit.

func (*TextureArray2D) GenerateMipmap

func (t *TextureArray2D) GenerateMipmap()

GenerateMipmap generates mipmaps for the texture.

func (*TextureArray2D) SubImage

func (t *TextureArray2D) SubImage(level int32, ox, oy int32, index int32, img image.Image)

SubImage loads an image into a texture at a specific position offset, array index and mipmap level.

type TextureFormat

type TextureFormat C.GLenum

A TextureFormat specifies the format used to store textures in memory.

type UniformBuffer

type UniformBuffer struct {
	// contains filtered or unexported fields
}

A UniformBuffer is a block of memory owned by the GPU.

func NewUniformBuffer

func NewUniformBuffer(data interface{}, f BufferFlags) UniformBuffer

NewUniformBuffer asks the GPU to allocate a new block of memory.

If data is a uinptr, it is interpreted as the desired size for the buffer (in bytes), and the content is not initialized. Otherwise data must be a pointer to a struct of pure values (no nested references). In all cases the size of the buffer is fixed at creation.

func (*UniformBuffer) Bind

func (ub *UniformBuffer) Bind(binding uint32)

Bind to a uniform binding index.

This index should correspond to one indicated by a layout qualifier in the shaders.

func (*UniformBuffer) Delete

func (ub *UniformBuffer) Delete()

Delete frees the buffer.

func (*UniformBuffer) SubData

func (ub *UniformBuffer) SubData(data interface{}, atOffset uintptr)

SubData updates the buffer with data, starting at a specified offset.

It is your responsability to ensure that the size of data plus the offset does not exceed the buffer size.

type VertexBuffer

type VertexBuffer struct {
	// contains filtered or unexported fields
}

A VertexBuffer is a block of memory owned by the GPU.

func NewVertexBuffer

func NewVertexBuffer(data interface{}, f BufferFlags) VertexBuffer

NewVertexBuffer asks the GPU to allocate a new block of memory.

If data is a uinptr, it is interpreted as the desired size for the buffer (in bytes), and the content is not initialized. Otherwise data must be a slice of pure values (no nested references). In all cases the size of the buffer is fixed at creation.

func (*VertexBuffer) Bind

func (vb *VertexBuffer) Bind(binding uint32, offset uintptr)

Bind to a vertex buffer binding index.

The buffer should use the same struct type than the one used in the corresponding call to Pipeline.VertexFormat.

func (*VertexBuffer) Delete

func (vb *VertexBuffer) Delete()

Delete frees the buffer.

func (*VertexBuffer) SubData

func (vb *VertexBuffer) SubData(data interface{}, atOffset uintptr)

SubData updates the buffer with data, starting at a specified offset.

It is your responsability to ensure that the size of data plus the offset does not exceed the buffer size.

type WindingDirection

type WindingDirection C.GLenum

A WindingDirection specifies a rotation direction.

const (
	Clockwise        WindingDirection = C.GL_CW
	CounterClockwise WindingDirection = C.GL_CCW
)

Used in `FrontFace`.

type WrapMode

type WrapMode C.GLuint

A WrapMode specifies the way a texture wraps.

const (
	ClampToBorder     WrapMode = C.GL_CLAMP_TO_BORDER
	ClampToEdge       WrapMode = C.GL_CLAMP_TO_EDGE
	MirrorClampToEdge WrapMode = C.GL_MIRROR_CLAMP_TO_EDGE
	Repeat            WrapMode = C.GL_REPEAT
	MirroredRepeat    WrapMode = C.GL_MIRRORED_REPEAT
)

Used in `Sampler.Wrap`.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL