Commit Graph

5633 Commits

Author SHA1 Message Date
Hans Goudey
c57ebc99eb Cleanup: Use StringRef instead of std::string in a few cases
Pull Request: https://projects.blender.org/blender/blender/pulls/130534
2024-11-19 19:47:27 +01:00
Jeroen Bakker
c2695e2dcc Vulkan: Add support for legacy platforms
Dynamic rendering is a Vulkan 1.3 feature. Most platforms have support
for them, but there are several legacy platforms that don't support dynamic
rendering or have driver bugs that don't allow us to use it.

This change will make dynamic rendering optional allowing legacy
platforms to use Vulkan.

**Limitations**

`GPU_LOADACTION_CLEAR` is implemented as clear attachments.
Render passes do support load clear, but adding support to it would
add complexity as it required multiple pipeline variations to support
suspend/resume rendering. It isn't clear when which variation should
be used what lead to compiling to many pipelines and branches in the
codebase. Using clear attachments doesn't require the complexity
for what is expected to be only used by platforms not supported by
the GPU vendors.

Subpass inputs and dual source blending are not supported as
Subpass inputs can alter the exact binding location of attachments.
Fixing this would add code complexity that is not used.

Ref: #129063

**Current state**

![image](/attachments/9ce012e5-2d88-4775-a636-2b74de812826)

Pull Request: https://projects.blender.org/blender/blender/pulls/129062
2024-11-19 16:30:31 +01:00
Jeroen Bakker
a5f8dbe9b5 Fix: Incorrect assert introduced in recent commit 2024-11-19 13:59:09 +01:00
Jeroen Bakker
8b9b67f2d3 Cleanup: Vulkan: Don't over-allocate render areas/viewports
In multiple parts (framebuffer and shader) the render areas/viewport could be
copied in an array of 16 structs, when only one is needed. This PR will use builder
patters so we don't over-allocate. Would spend less CPU cycles when constructing
render info, render passes/framebuffers, shaders.

Cleanup was part of !129062

Pull Request: https://projects.blender.org/blender/blender/pulls/130515
2024-11-19 13:40:12 +01:00
Jeroen Bakker
b9dab68ce2 Vulkan: Support clearing GPU_DATA_2_10_10_10_REV textures
Using floats to clear GPU_DATA_2_10_10_10_REV textures were not
supported. It will be needed to support legacy platforms.

Detected during development of !129062

Pull Request: https://projects.blender.org/blender/blender/pulls/130511
2024-11-19 13:39:36 +01:00
Jeroen Bakker
a499c711a9 Vulkan: Refactor descriptor set bindings
Shader interface used shader create info bind types to communicate bind
types to descriptor sets. However Vulkan supports more bind types than
Blender exposes in its API. Current implementation resulted that next to
the bind type the actual resource was queried to find out what needed to
be done.

This PR makes it more clear to convert the shader create info bind type
to `VKBindType` that contains the vulkan bind types we support.

Pull Request: https://projects.blender.org/blender/blender/pulls/130509
2024-11-19 13:38:13 +01:00
Jeroen Bakker
560c75e59c Cleanup: Vulkan: Remove unused code
Code is a left over and should not be used. It has been replaced by `VKResourceBinding`

Pull Request: https://projects.blender.org/blender/blender/pulls/130507
2024-11-19 13:35:47 +01:00
Jeroen Bakker
4018e52d30 GPU: OpenGL&Vulkan incorrect workarounds GLSL
OpenGL & Vulkan has workarounds when gl_Layer/gl_ViewportIndex isn't
supported. In this case a geometry shader will is generated. This
geometry shader doesn't follow the GLSL standard and doesn't work on
some platforms. This has not been an issue as the platforms that
don't support gl_Layer/gl_ViewportIndex don't show the issue.

According to the specs gl_Layer and gl_ViewportIndex should be set for
each call to EmitVertex. A shader should not rely on that EmitVertex
reuses the same memory.

Ref https://www.khronos.org/opengl/wiki/Geometry_Shader#Layered_rendering
```
Warning: gl_Layer and gl_ViewportIndex are GS output variables. As such, every time
you call EmitVertex, their values will become undefined. Therefore, you must set
these variables every time you loop over outputs.
```

Issue detected during development of !129062

Pull Request: https://projects.blender.org/blender/blender/pulls/130506
2024-11-19 13:35:09 +01:00
Jeroen Bakker
f7fef99b31 Vulkan: Fix renderdoc step-by-step debugger.
Recently the GLSL code was changed in Blender. For every GLSL file
the #line directive was added. However due to limitations in Blender
we misuse the indexed based line directive to store a hash. This is not
according to the spec where indexes should index the source inside the
array of sources. In vulkan the indexed based approach is not
'supported' as the compiler inputs only accepts a single file.

We tried to support file based approach but that lead to other issues in
renderdoc. Might be related to that the source file doesn't exist on the
file system.

This PR fixes this by scrambling the #line directive so the
step-by-step debugger can be used. The scrabling only happens when
blender is started with the `--debug-gpu-renderdoc` startup argument.

Pull Request: https://projects.blender.org/blender/blender/pulls/130458
2024-11-18 17:37:35 +01:00
Clément Foucault
94d2a1e6a2 GPU: GLSL CPP stubs: Allow printf in code 2024-11-17 19:17:12 +01:00
Jacques Lucke
4836e0209a Cleanup: remove invalid template usage
This does not compile with GCC on C++20.
2024-11-16 23:10:44 +01:00
Jeroen Bakker
c1379ff2b3 Fix #130161: Vulkan: Grid overlay artifact when copying to swap chain
When copying the window to the swap chain the image needs to be copied
upside down to match Vulkan/OpenGL image coordinate differences.

There was an of by 1 error when copying resulting in minor drawing
glitch which was noticeable when looking at the viewport grid.

Pull Request: https://projects.blender.org/blender/blender/pulls/130328
2024-11-15 17:12:24 +01:00
Clément Foucault
c0c816f846 GPU: GLSL compilation as C++ for workbench static shaders 2024-11-14 23:15:06 +01:00
Sergey Sharybin
f70ec20ab8 Fix: Leak of GHOST GPU contexts in Metal backend
Need to respect the ownership and lifetime of objects.

Pull Request: https://projects.blender.org/blender/blender/pulls/130282
2024-11-14 17:18:55 +01:00
Miguel Pozo
9ad9984611 GPU: Fill uninitialized buffers with poison values
Pull Request: https://projects.blender.org/blender/blender/pulls/130240
2024-11-14 15:31:20 +01:00
Jeroen Bakker
272403a6cb Vulkan: Remove empty attachments
Some Vulkan platforms don't support framebuffers with gaps between the
color attachments. Workbench framebuffers can create gaps.
(`in_front_fb`, `main_fb` when used for wire frame drawing).

This PR implements a detection mechanism to detect gaps. It also disables
features that are not able to comply to this requirement.

Detected when working on #129062

Pull Request: https://projects.blender.org/blender/blender/pulls/130258
2024-11-14 13:55:33 +01:00
Lalit Shankar Chowdhury
6e49acb655 Vulkan: Show supported device extensions in system-info output
When vulkan is used the system-info.txt doesn't contain device extensions.
This PR adds device extensions to the system info.

Pull Request: https://projects.blender.org/blender/blender/pulls/128658
2024-11-14 13:15:09 +01:00
Clément Foucault
b76cc897b6 Cleanu: GPU: Address GLSL warnings 2024-11-13 12:38:00 +01:00
Clément Foucault
1aea4fb5c7 GPU: GLSL C++ shaders: Silence unuseful warnings 2024-11-13 12:37:00 +01:00
Clément Foucault
29b3df7504 GPU: GLSL compilation as C++ for draw intern shaders
Allow compilation of shaders using C++ for linting and
IDE support.

Related #127983

Pull Request: https://projects.blender.org/blender/blender/pulls/130193
2024-11-13 12:32:39 +01:00
Clément Foucault
091004f1b8 GPU: GLSL compilation as C++ for gpu static shaders
Allow compilation of shaders using C++ for linting and
IDE support.

Related #127983

Pull Request: https://projects.blender.org/blender/blender/pulls/128724
2024-11-12 18:53:34 +01:00
Jason Fielder
4fc2e1c842 Fix #129661: Wait for GPU to complete to avoid use-after-free issues.
In some cases the MTLContext was being destroyed before all GPU work was completed causing the (outstanding) command buffer completion event handler to update a command buffer that had already been freed. This behaviour was introduced by [this](https://projects.blender.org/blender/blender/commit/6da42e9c951b) change which updated the event handler to track the number of outstanding command buffers per context as well as system-wide.

Reproduced the issue with ASAN enabled and confirmed that waiting for the GPU to complete fixes the issue.

Also contains a minor fix for unitiiliased values in MTLAttachments identified by ASAN.

Authored by Apple: James McCarthy"

Co-authored-by: James McCarthy <jamesmccarthy@apple.com>
Pull Request: https://projects.blender.org/blender/blender/pulls/129686
2024-11-12 16:48:43 +01:00
Clément Foucault
642933ffe6 Metal: Guard advanced vertex format against newer osx version
Fixes a build error on older macos.
2024-11-12 13:06:15 +01:00
Clément Foucault
b17af94e2e EEVEE: Use packed type for codegen structs
This reduces register pressure on mac.

Mr Elephant 17.9s > 17.2s (4% speedup)

Extracted from #116728

Pull Request: https://projects.blender.org/blender/blender/pulls/129605
2024-11-12 12:58:58 +01:00
Clément Foucault
e9252f206b GPU: Comment out test not compatible with metal backend
These test are either not compatible because of the
spec or are just broken in the current state of the backend.

These should be dealt with soon.
2024-11-10 15:16:34 +01:00
Clément Foucault
e79f12cf43 Fix: GPU: Broken static shader tests
Caused by 5d162719ba
2024-11-10 15:16:34 +01:00
Clément Foucault
8260e3aa81 GPU: Simplify framebuffer tests 2024-11-10 15:16:34 +01:00
Clément Foucault
f67ea33993 Cleanup: Metal: Fix clang-tidy warnings
Replace != "" by more semanticaly friendly `is_empty`.
2024-11-10 00:29:03 +01:00
Clément Foucault
85f6350c0f Fix: GPU: Missing include breaking shader tests 2024-11-09 21:50:37 +01:00
Clément Foucault
6f4b106da3 Metal: Refactor format conversion logic
Simplify the logic and handle all cases.
2024-11-09 21:50:37 +01:00
Clément Foucault
5d162719ba Cleanup: Metal: Fix clang-tidy warning
Replace size > 0 by more semanticaly friendly `is_empty`.
2024-11-09 21:50:37 +01:00
Clément Foucault
9b91a42240 GPU: Improve fetch mode tests to cover GPU_FETCH_INT_TO_FLOAT_UNIT 2024-11-09 21:50:37 +01:00
Clément Foucault
2738e33a58 GPU: Silence invalid fetch mode tests on Metal
These vertex buffer setup are invalid on metal.
For now simply disable them on Apple hardware.
2024-11-09 21:50:37 +01:00
Clément Foucault
ef8ea88f5f Fix: GPU: Tests not passing on Metal with ASAN on
Fixes a few stack overflow error, reduce framebuffer size
to avoid errors flooding the output.
2024-11-09 21:50:37 +01:00
Clément Foucault
654cc9ed36 GPU: Fix printf force injection logic and limit it to material shader
This fixes backend error caused by missing resource.
2024-11-08 20:20:07 +01:00
Clément Foucault
93a10cbf7e GPU: Enable printf only between render boundaries and use a stack
Printf buffer read needs to be inside render boundaries
to work. Since render boundaries can be nested, use a stack.

Fixes assert when quitting blender.
2024-11-08 20:01:08 +01:00
Clément Foucault
510f97865a Fix: Metal: Address ASAN errors
Fix several error reported by asan when just launching blender.
2024-11-08 16:09:09 +01:00
Clément Foucault
72b24fa336 Cleanup: Metal: Simplify mtl_convert_vertex_format
_No response_

Pull Request: https://projects.blender.org/blender/blender/pulls/130036
2024-11-08 16:07:58 +01:00
Jeroen Bakker
4a9d53f9f3 Merge branch 'blender-v4.3-release' 2024-11-08 12:30:33 +01:00
Jeroen Bakker
b86ed45fcb Fix unreported: Vulkan: Empty device list
The list of vulkan devices is empty. This regression was introduced by
91960b07db. Vulkan needs to initialize the
platform twice. Once when the backend starts, and the second time when
the device is selected. The device list is added when the backend
starts, but was cleared when the device was initialized, making the list
empty.

Pull Request: https://projects.blender.org/blender/blender/pulls/130020
2024-11-08 12:29:23 +01:00
Jeroen Bakker
b2e1677b36 Fix: Vulkan: Incorrect depth on ARM devices
When gl_FragDepth is defined in the fragment shader and the depth isn't
written to the driver would reset the value to 0. This PR fixes this by
not putting the gl_FragDepth in the shader when it uses the
`depth_unchanged` qualifier or doesn't find any usage in the GLSL.

Pull Request: https://projects.blender.org/blender/blender/pulls/130016
2024-11-08 12:27:46 +01:00
Clément Foucault
4416e27b14 GPU: GLSL C++ stubs: Add support for depth and buffer sampler fetch 2024-11-08 00:28:59 +01:00
Clément Foucault
0a3008172b Cleanup: GPU: Silence shader warnings 2024-11-08 00:28:08 +01:00
Bastien Montagne
e156a422cd Merge branch 'blender-v4.3-release' 2024-11-07 16:01:04 +01:00
Jason Fielder
658700ddff Fix #126364: Metal: modified texture usage flags causing cache misses
For Metal we can change the texture usage flags to get more optimal
behaviour - one example is adding the attachment flag so we can utilise
renders to do texture clears. However these usage flags are used as the
part of the match-criteria when trying to reuse released textures in
the texture pool.

The modifications means a request for the same type of texture will
fail causing a cache miss. When we render to an
image-view the texture pool is not released until the final sample has
been rendered as we consider the entire render to be a single frame
(as opposed to normal viewport rendering when we are presenting the
intermediate results).

This causes the texture pool to grow and grow and grow hence the large
memory usage. This fix splits the usage flags
into two sets, the internal ones we use to create the MTLTexture (which
we may modify) and the originally requested ones. The originally requested
ones are used for the texture pool matching.

This fix also improves memory efficiency for normal viewport rendering.

Mr Elephant Scene
Before -> After
Load scene in viewport: 13.04Gb ->  9.15 Gb
Viewport Render Image: 78.69Gb -> 16.61Gb

Authored by Apple: James McCarthy

Pull Request: https://projects.blender.org/blender/blender/pulls/129951
2024-11-07 15:53:09 +01:00
Jeroen Bakker
a4529f0e17 Merge branch 'blender-v4.3-release' 2024-11-07 14:01:32 +01:00
Jacques Lucke
3688a2919b Merge branch 'blender-v4.3-release' 2024-11-07 14:00:52 +01:00
Jeroen Bakker
da767bcbdc Fix: Vulkan: Enable interleaved tests
Interleaved tests where disabled for Vulkan, but interleaving has been
implemented. This PR enabled these tests.

Pull Request: https://projects.blender.org/blender/blender/pulls/129957
2024-11-07 14:00:51 +01:00
Jeroen Bakker
e0f699abdb Fix: Vulkan: Read & write outside of bounds
When running test cases
`test_texture_roundtrip__GPU_DATA_10_11_11_REV__GPU_R11F_G11F_B10F`
would read and write outside of allocated memory. This is an error in
the test case itself the GPU API doesn't have a public function to get
the desired byte and component size.

Pull Request: https://projects.blender.org/blender/blender/pulls/129958
2024-11-07 13:59:53 +01:00
Jeroen Bakker
91960b07db Fix unreported: Vulkan: Memory leak
When exiting Blender the list of devices was not freed, leading
to a memory leak.

Pull Request: https://projects.blender.org/blender/blender/pulls/129956
2024-11-07 13:59:07 +01:00