Commit graph

142 commits

Author SHA1 Message Date
Simon Ser
fe06e5f49a Use wl_container_of() instead of casts
This slightly improves type safety.

The culprits were found with:

    git grep -E '\([a-z0-9_ ]+ \*\)\W?[a-z]'
2023-07-11 20:16:17 +02:00
Alexander Orzechowski
38d451bcb5 render/vulkan: Don't compute texture.has_alpha until first...
...texture view is dynamically created
2023-06-21 11:37:54 -04:00
Alexander Orzechowski
06c0b0a204 render/vulkan: Initialize to fix compilation error 2023-06-19 18:00:26 -04:00
Alexander Orzechowski
2044cc2311 render: Introduce wlr_render_texture_options.blend_mode 2023-06-19 13:16:34 -04:00
Alexander Orzechowski
6bd44c4fcd renderer: Introduce wlr_scale_filter_mode 2023-06-19 12:25:38 -04:00
Alexander Orzechowski
3ee0f52e09 render/vulkan: Dynamically create texture views
Now that we are dynamically creating pipeline layouts, we need separate
texture views for each pipeline layout we choose to use with a texture.
2023-06-17 21:21:35 -04:00
Alexander Orzechowski
7c5a3afd60 render/vulkan: Inline init_sampler 2023-06-17 21:21:35 -04:00
Alexander Orzechowski
8a387b5558 render/vulkan: Dynamically create pipeline layouts
These will happen lazily when pipelines get created.
2023-06-17 21:21:31 -04:00
Alexander Orzechowski
3623005858 render/vulkan/pipeline_key: Add blending
This will become necessary when we switch away from scissoring. For the
time being, this cleans things up a bit and allows for a trivial
blending implementation for textures when that comes.
2023-06-16 19:20:04 -04:00
Alexander Orzechowski
9d31372930 render/vulkan: Handle quad pipeline through generic pipeline path 2023-06-16 19:20:03 -04:00
Alexander Orzechowski
97fdd57eb2 render/vulkan: Dynamically handle pipeline creation for textures
If we ever wanted to handle dynamic state that requires new pipelines
such as using different texture filters those can be added here with more
ease.
2023-06-16 19:09:23 -04:00
Simon Ser
709c9dd287 render/vulkan: rename tex_usage to shm_tex_usage
Same motivation as fdb199a43c ("render/vulkan: rename
tex_features to shm_tex_features").
2023-06-12 12:02:22 +00:00
Simon Ser
30616bcf0c render/vulkan: reset scissor before post-blend subpass
Otherwise only the last command's area will be copied over.
2023-06-07 21:46:08 +02:00
Simon Ser
150a88bd03 render/vulkan: fix blend subpass matrix
renderer->render_{width,height} are unused with the render pass
API.
2023-06-07 21:30:35 +02:00
Simon Ser
fd9e4b860f render/vulkan: fix bound pipeline check for output_pipe
renderer->bound_pipe is legacy, pass->bound_pipeline is used for
the render pass API code-path.

Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3657
2023-06-07 20:46:33 +02:00
Simon Ser
1b947c08c6 render/vulkan: require format info for shm
We use the format info to check the stride and need it to perform
the texture upload.
2023-06-07 10:06:27 +00:00
Simon Ser
2a2f0772a9 render/vulkan: de-duplicate texture VkImageView init
The logic is the same for both shm and DMA-BUF.
2023-06-07 10:06:27 +00:00
Simon Ser
cebe991e95 render/vulkan: split off YCbCr texture features
Avoids repeating the common bits between dma_tex_features and
dma_tex_ycbcr_features, and we will need just the YCbCr-related
flags for shm YCbCr support soon.
2023-06-07 10:06:27 +00:00
Simon Ser
fdb199a43c render/vulkan: rename tex_features to shm_tex_features
These features are required for shm only: the TRANSFER stuff is
for texture upload. We don't need these for DMA-BUFs. Make this
clearer by changing the name.

Also re-order the definitions to group all texture-related features
together.
2023-06-07 10:06:27 +00:00
Rose Hudson
9e8947e4d5 add render timer API
Based on five calls:
wlr_render_timer_create - creates a timer which can be reused across
  frames on the same renderer
wlr_renderer_begin_buffer_pass - now takes a timer so that backends can
  record when the rendering starts and finishes
wlr_render_timer_get_time - should be called as late as possible so that
  queries can make their way back from the GPU
wlr_render_timer_destroy - self-explanatory

The timer is exposed as an opaque `struct wlr_render_timer` so that
backends can store whatever they want in there.
2023-06-05 19:50:07 +00:00
Simon Ser
beb820b573 render/vulkan: improve error handling in vulkan_begin_render_pass()
Release the command buffer if we end up not submitting it.
2023-06-01 10:42:56 +02:00
Simon Ser
0ba3ea3bcd render/vulkan: improve error handling in render_pass_submit()
Closes: https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/3644
2023-06-01 10:42:56 +02:00
Simon Ser
ba276e5ac2 render/vulkan: handle vulkan_record_stage_cb() failures 2023-05-31 19:40:59 +00:00
Simon Ser
e07c77f846 render/vulkan: implement render pass API 2023-05-30 09:42:19 +00:00
Simon Ser
3de330ec85 render/vulkan: add 10, 12, and 16-bit YCbCr formats 2023-05-28 14:51:19 +00:00
Simon Ser
28e8d92263 render/vulkan: document TEXTURE_TRANSFORM_* in shader 2023-05-26 12:29:30 +00:00
Simon Ser
f60b367db7 render/vulkan: drop unused vulkan_has_extension() 2023-05-26 12:25:53 +00:00
Simon Ser
42eec38ab6 render/vulkan: drop unused vulkan_change_layout_queue() 2023-05-26 12:25:53 +00:00
Simon Ser
7099fa2ea4 render/vulkan: de-dup pipeline layout initialization 2023-05-24 08:58:59 +00:00
Simon Ser
16dea12dae render/vulkan: add more YCbCr formats
The Vulkan spec states:

> For the purposes of range expansion and Y′CBCR model conversion,
> the R and B components contain color difference (chroma) values
> and the G component contains luma.

The equations below that sentence also help understand the mapping.
2023-05-24 08:58:59 +00:00
Simon Ser
a682fa6c21 render/vulkan: require support for linear filter for YCbCr
YCBCR_CONVERSION_LINEAR_FILTER is not enough: this one only covers
chromaFilter. For magFilter/minFilter we need FILTER_LINEAR as well.
2023-05-24 08:58:59 +00:00
Simon Ser
91d469d8c0 render/vulkan: check format support before creating YCbCr sampler
We need to check whether the format supports dma_tex_ycbcr_features
before creating the YCbCr sampler.
2023-05-24 08:58:59 +00:00
Simon Ser
c7ae9dfaf8 render/vulkan: generalize YCbCr format support 2023-05-24 08:58:59 +00:00
Simon Ser
50b494d0f9 render/vulkan: add init_{default,ycbcr}_pipeline_layout() 2023-05-24 08:58:59 +00:00
Simon Ser
5ea0eb3468 render/vulkan: add vulkan_get_pipeline_layout()
Will make it easier to add more pipeline layouts for other YCbCr
formats.
2023-05-24 08:58:59 +00:00
Simon Ser
fd38761676 render/vulkan: introduce struct wlr_vk_pipeline_layout
This will make it easier to create one pipeline layout (plus related
objects) per YCbCr format.
2023-05-24 08:58:59 +00:00
Simon Ser
db619009dc render/vulkan: use same sampler params for RGBA and NV12 2023-05-24 08:58:59 +00:00
Simon Ser
9755016422 render/vulkan: use VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE for default sampler
We don't actually need the REPEAT mode, and this makes things more
consistent with the YCbCr sampler (which requires CLAMP_TO_EDGE for
spec compliance).

Also drop borderColor which is unused for this mode.
2023-05-24 08:58:59 +00:00
Simon Ser
fe7c998666 render/vulkan: use identity swizzle for YCbCr formats
Fixes the following validation error:

    [ VUID-VkImageViewCreateInfo-pNext-01970 ] Object 0: handle = 0x62e00003c400, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xf378e14b | vkCreateImageView(): If there is a VkSamplerYcbcrConversion, the imageView must be created with the identity swizzle.
2023-05-24 08:58:59 +00:00
Simon Ser
091aa5582a render/vulkan: fix VkPipelineLayout when texturing NV12
The default pipeline layout was always passed. However, for NV12 we
need to pass a different one.
2023-05-24 08:58:59 +00:00
Simon Ser
fc3ad784e0 render/vulkan: extract quad pipeline init to separate function
Makes it clearer that all of these structs are for the quad pipeline.
2023-05-24 08:58:59 +00:00
Simon Ser
09f5a00585 render/vulkan: fix YCbCr format check in vulkan_texture_from_pixels() 2023-05-23 20:31:42 +02:00
Simon Ser
d7bebb0a4c render/vulkan: drop unnecessary comments
Some comments in here are noise.
2023-05-22 18:53:15 +02:00
Simon Ser
96f3f3c92e render/pixel-format: add support for block-based formats
Some formats like sub-sampled YCbCr use a block of bytes to
store the color values for more than one pixel. Update our format
table to be able to handle such formats.
2023-05-21 20:28:45 +00:00
Manuel Stoeckl
10dd416694 render/vulkan: allow rendering to non-8-bit buffers
This is implemented by a two-subpass rendering scheme; the first
subpass draws (and blends) onto a linear R16G16B16A16_SFLOAT buffer,
while the second subpass performs linear->srgb conversion, writing
onto the actual output buffer.
2023-05-12 15:09:02 +00:00
Simon Ser
8cdc4b7a31 render/vulkan: wait for idle queue before destroying render buffer
This fixes the following validation errors when shutting down Sway:

    00:00:01.263 [wlr] [render/vulkan/vulkan.c:65] Validation Error: [ VUID-vkDestroyFramebuffer-framebuffer-00892 ] Object 0: handle = 0x62e00003c400, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xdb308312 | Cannot call vkDestroyFramebuffer on VkFramebuffer 0x2e2cd000000002b[] that is currently in use by a command buffer. The Vulkan spec states: All submitted commands that refer to framebuffer must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-00892) (VUID-vkDestroyFramebuffer-framebuffer-00892)
    00:00:01.264 [wlr] [render/vulkan/vulkan.c:65] Validation Error: [ VUID-vkDestroyImage-image-01000 ] Object 0: handle = 0x62e00003c400, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xf2d29b5a | Cannot call vkDestroyImage on VkImage 0x3fbcd60000000028[] that is currently in use by a command buffer. The Vulkan spec states: All submitted commands that refer to image, either directly or via a VkImageView, must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.3-extensions/html/vkspec.html#VUID-vkDestroyImage-image-01000) (VUID-vkDestroyImage-image-01000)
2023-05-12 16:13:24 +02:00
Simon Ser
e353c5c631 render/vulkan: enable NV12 on big-endian
This format doesn't change its layout on big endian because it's
not packed and has 8-bit channels.
2023-05-11 07:25:32 +00:00
Simon Ser
095a63a11c render/vulkan: improve logging when creating texture
Remove debug logs when a texture is created, since this happens
pretty often. Use drmGetFormatName() and drmGetFormatModifierName()
to log DRM formats and modifiers.
2023-05-09 12:39:20 +02:00
Manuel Stoeckl
e6fc5d1e49 render/vulkan: increase next descriptor pool size
This ensures that the pool sizes grow exponentially, making the number
of pools needed logarithmic in the number of descriptors, instead of
linear. Since the first pool's size is 256, this change only has an
effect when the compositor creates a large number of textures.
2023-05-06 18:16:45 +00:00
Simon Ser
b03f71fe5f render/vulkan: add support for NV12 2023-05-04 20:07:20 +00:00