aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/engines/maxwell_3d.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #334 from snowstormxd/codex/upstream-mkw-testJonas30 hours1-5/+8
|\ | | | | MKW performance improvements
| * gpu: make register-write history opt-in in release buildssnowstormxd34 hours1-0/+4
| | | | | | | | | | | | | | | | Keep error reporting and debug-build history. EDEN_NX2_3D_HISTORY enables the full ring in release builds without recording every method during normal play. Assisted by Codex. (cherry picked from commit cac6081916e8e5461e2754308cd8986deaec774b)
| * macro: execute native parameters without a second FIFO copysnowstormxd34 hours1-5/+4
| | | | | | | | | | | | | | | | Use the owned parameter vector for DMA FIFO appends. Add a native JIT regression covering reallocation and repeated invocations against the copied-input path. Assisted by Codex. (cherry picked from commit 5b6803aaab18e332493903ee49cab026c041d5dc)
* | video_core: continue a split instance loop at its own instance indexSssnowyyy33 hours1-2/+2
|/ | | | | | | | | | | | | | | | | Writing any register outside the instance loop's own methods now draws the waiting instances first, so the batch sees the base instance it was begun with. When a title writes another register in the middle of a loop, such as a per-instance constant buffer, the loop is drawn in several batches, and each later batch started again at global_base_instance_index with one extra instance, so it used the instance IDs of the first records. Count the instances already drawn for the current loop and start the next batch after them, without the extra first-instance draw. A loop that is not split is drawn exactly as before. Follow-up to 2ad0830d2f and eb99da6072. Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
* Merge nx2 into nx2-experimentalkraibse39 hours1-0/+15
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Resolved by area: - audio feature_support.h: nx2's native revision handling. - fiber.cpp: ours, which also drops the unused rewind stack. - host_memory.cpp: ours granule bitmap and HintCold, plus nx2's fallocate hole punching per whole dirty granule on Linux. - texture_cache.h: nx2's old-age eviction pass, then our Collect(). - kepler_compute.cpp: shared upscale slots, then Fortune's Weave's, then the Kirby Air Riders scan. - nx2_gsv.h: ours, plus nx2's GetBufferMaxResolution and graphics device ids (1-based). - nvhost_ctrl_gpu.cpp: engine support flag bits 40-44. - lower_to_maxwell.h: ours as the base, with nx2's seven lowering commits applied one at a time. Second texture descriptor buffers are read bindless in TEX, TLD.SCR (level zero) and SUST; FSEL keeps its operand modifiers; TXD takes any channel mask. lower_to_maxwell.h lowers 837 Fortune's Weave and 1183 Mario Kart World shader dumps with the same rejects as nx2 and ours (12 and 0). Assisted-by: Claude Sonnet 5.5 (conflict analysis and drafting)
| * video_core: keep root tables and bind table 0 as constant bank 17Duck9122 days1-0/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The 3D methods 0x504/0x508 write eight 256-byte root tables, which shaders read as constant banks 24-31; NVN2 keeps push constants in table 0 (bank 17 after the Ampere lowering). Fire Emblem: Fortune's Weave keeps its material constants there and never binds bank 17, and the blit constants pass replaced those reads with render-target sizes, flooding its 3D scenes red. Maxwell3D now keeps the tables, the buffer cache streams table 0 as bank 17 when the game has not bound one, and the blit constants pass leaves shaders that read bank 17 outside its parameter block alone. Assisted-by: Claude Opus 5.5 (debugging, implementation and drafting) Signed-off-by: Duck912 <350528965+Duck912@users.noreply.github.com>
* | video_core: draw deferred instances before the state after their loopTakoroka4 days1-0/+10
|/ | | | | | | | | | | | | | | | | A draw of N instances arrives as Begin(First)/End and N-1 Begin(Subsequent)/ End pairs. The draw manager draws the first at once and the rest together at DrawDeferred, which ran at the next Begin(First) or when the macro returned. NVN's draw macros reset the base instance register and its copy in c[0][0x644] right after the loop, before returning, so the deferred instances were drawn with base instance 0 and read the first records of the instance buffer instead of their own. In Mario Kart World every tree mesh is drawn this way, from one shared instance buffer: each mesh got other meshes' transforms, which showed as low-detail, inflated or scattered trees. Any write other than the loop's own methods (draw begin/end, vertex and index counts, inline indices) now draws the waiting instances first.
* build: fixes for clang-clTakoroka5 days1-1/+1
| | | | | | | | | - (std::min)/(std::max) where windows.h's macros are visible - LAMBDA_FORCEINLINE: always_inline under clang (clang-cl defines _MSC_VER but rejects [[msvc::forceinline]] on lambdas) - ImageBase::FindView: find_if, as MSVC's STL takes its vectorized find for ImageViewInfo under clang-cl and fails a size assertion - parentheses for -Wlogical-op-parentheses in the Ampere lowering
* video_core: GPU thread split on by default for Switch 2 titles; cheaper ↵Takoroka5 days1-1/+3
| | | | | | | | | | | | | front paths Clean A/B in title 1 (3 rounds each): 1.46x the draws a second of one thread, frames 17% shorter, no crashes, front register copies equal to the back's in 57,089 checks. EDEN_NX2_SPLIT=0 runs everything on one thread, =1 keeps macros on the back. The front's per-write paths no longer check guarded statics (GpuSplit::Get, Nx2Profile::Enabled, the skip-same switches) and the ring's method writes are inline. Notes row 145.
* video_core: split the GPU thread in two (EDEN_NX2_SPLIT, off by default)Takoroka5 days1-0/+425
| | | | | | | | | | | | | | | | | | | | | | | | The GPU thread (front) takes the CPU's commands, parses command lists and runs the puller; engine method calls and everything behind them (registers, draws, dispatches, the rasterizer and its caches) run in order on a second thread (back), fed through a single-producer single-consumer ring (gpu_split.h). Work the front did on back-owned state (end of command list flushes, channel binds, semaphore releases, syncpoint increments, flush/invalidate requests, presentation) is deferred into the same ring; the front waits for the back only where it needs a result from that state: semaphore acquires and MME DMA reads. EDEN_NX2_SPLIT=1 runs macros on the back. EDEN_NX2_SPLIT=2 runs the 3D and compute macros on the front against copies of the registers they read (Maxwell3D/KeplerCompute Front*), drops state writes that keep a register's value there, and sends the rest. EDEN_NX2_SPLIT_VERIFY=1 compares the copies with the back's registers every 4096 macro calls (0 differences in 40,193 checks in title 1); EDEN_NX2_SPLIT_CHECK=1 logs the stack of any other thread using the Vulkan scheduler while the back runs. Switch 2 titles, Vulkan, non-accurate GPU only. Title 1, 3D attract loop: ~44,000 draws a second on one thread, ~47,400 with EDEN_NX2_SPLIT=1, 50,000-66,500 with EDEN_NX2_SPLIT=2.
* maxwell_3d: no method dispatch for non-executable register writes; notes 133-137Takoroka5 days1-1/+5
| | | | | | | | ProcessMethodCall and the draw manager behind it act only on executable methods, so CallMethod stops at the dirty flags for the rest (macro replays write ~2.4 million of those a second). No change beyond run-to-run noise in two profiled runs; it only removes work. Notes: row 133 corrected (those courses are bound by the GPU thread, not the host GPU: 20-40% busy), rows 135-137 (same-value writes, native compute registers, 2D blits).
* maxwell_3d: drop state register writes that keep the register's valueTakoroka5 days1-3/+26
| | | | | | | | | | | Title 1 makes ~6 million 3D register writes a second and ~60% of them write the value the register already holds (counted with EDEN_NX2_GPU_PROFILE), most from macro memo replays. For registers without side effects (not in execution_mask: draws, clears, constant buffer data and binds, semaphores, ...) such a write changes nothing, but it set dirty flags that made the next draw re-check that state. CallMethod and the sunk writes now skip them after shadow RAM processing. Two profiled runs each: macro calls 169 ns instead of 185, draw setup 5.80 us instead of 5.95. EDEN_NX2_SKIP_SAME=0 turns it off.
* video_core: copy whole macro calls to the stackTakoroka5 days1-2/+22
| | | | | | | | | Nearly every macro call arrives whole in one method run (~1,000,000 a second in title 1); its parameters were appended to a std::vector first (~2% of the GPU thread). They are now copied to a stack array. Still a copy: the command list is often guest memory read in place, which the guest may reuse while the macro runs, and the macro memo stores the parameters after the call. Accurate GPU mode keeps the vector (it rewrites parameters in place). EDEN_NX2_MACRO_COPY=1 always uses the vector.
* nx2: measure the TSC on AMD, no rethrows for rejected shaders, debug hooks ↵Takoroka6 days1-3/+6
| | | | | | | | | | | | | | | off the hot path - AMD CPUs have no CPUID leaf 0x15, so the TSC frequency stayed 0 and every guest CNTPCT read went through QueryPerformanceCounter (~10% of the game's main core in title 1). Measure it like Intel CPUs without a crystal frequency. - A rejected native shader was rethrown (two C++ throws) every time it was bound; return false instead (~1-2% of the GPU thread). - The semaphore watch, pushbuffer entry hashing, first-write trace and per-macro debug logs ran on every command word or macro call; they now cost a flag check unless their environment variable is set (~4% of the GPU thread). Also starts the macro engine's profile zone.
* nx2: method data continues across GPFIFO entriesTakoroka7 days1-0/+21
| | | | | | | | | | | | | | Title 4 calls a 3D macro with a 6-word IncreaseOnce header, ends the main GPFIFO entry after the first word and supplies the other five in a 5-word subroutine entry. The split-method parking (an entry elsewhere was treated as a call with a clean method state) fed those parameters to the parser as headers: the macro ran with garbage, later draws read megabytes of unmapped memory and the host driver timed out at the loading screen after the dock scene. As on the hardware, the method state now simply continues; the old guess stays behind EDEN_NX2_PARK_SPLIT_METHODS. Debug aids: splits are logged at debug level with the words around them, and a 3D write that interrupts a macro's parameters dumps the last 48 writes.
* nx2: title 4 runs past its loading screen without GPU stallsTakoroka7 days1-0/+20
| | | | | | | | | | | | | | | - Native QMD: a launch whose shader Eden can't translate still completes and fires its releases (the console never fails a launch; queues wait on them). - QMD releases with flag bit 19 are max releases: NVN2 tracks QMD completion in a word other releases also advance, so a plain write moved it backwards. - Ampere lowering: LDSM.16.M88.{1,2,4} (SHFL + LDS), IMAD with a negated uniform addend, strong LDG (bit 77), 2D TLD4 gather, RED MIN/MAX/..., AST of RZ. 210 of the 214 shaders title 4 uses after its menu now lower. - Maxwell3D: ignore constant buffer binds to slots >= 18 instead of writing past the state array. - Debug: EDEN_NX2_SEM_WATCH covers QMD and compute-macro releases and logs address spaces; EDEN_NX2_3D_METHODS logs the first write to each 3D method; constant buffer binds are logged once per stage/slot.
* Switch 2: Turing macros, native compute, Ampere shader lowering, native tilingTakoroka7 days1-14/+17
| | | | | | | | | | | | | | | | | From changes.patch: the TU104/GA10x MME interpreter (shared macro context for the process's channels, also on the compute class), native compute with QMD 3.0 dependency scheduling, the Ampere-to-Maxwell shader lowering, native vertex stream sizes, and the console's GOB swizzle for textures, DMA copies and the host unswizzle shaders. Switch 2 channels turn all of it on at init. The lowering is widened for title 4 (all 32 of its programs lower): general TEX (any dimension/LOD/mask, operand split 1+1/2+1/2+2/4+n, any but consistent descriptor buffer), cube/array, SULD channel masks, 128-bit STG, indexed IPA, VOTE, SHFL with any immediate or predicate output, R2P/P2R byte select, uniform ULOP3/ULEA/UBREV/UFLO.SH/UISETP signed/UMOV URZ, IMNMX cbuf, IADD3 and FFMA uniform operands, FMUL /4 /8 x8, and BSSY/BSYNC/BREAK/WARPSYNC as no-ops. The capture stops at unmapped memory. EDEN_NX2_SHADER_DUMP dumps every native program; tools in C:\dev\nx2work test the lowering offline.
* Switch 2 GPU: syncpt server, identity GPU mappings, Ampere classes, submit ↵Takoroka7 days1-0/+7
| | | | | | | | | | | | | | | fences - gsv 204: real syncpoint shared page (values mirrored from host1x, armed waits acknowledged by a 500us poller); first handle is the writable request event. - syncpt 22/201/202: per-slot events signalled through host1x guest actions. - nx2:gpu sub 101 memory is identity-mapped (GPU VA == CPU VA) into every nvhost-as-gpu GMMU via Nx2GpuMemoryRegistry; SMMU physical range widened to 34 bits for the 10/12 GiB layouts. - Puller runs Ampere 3D/compute/copy classes on the Maxwell engines; class 0 unbinds. - Turing+ macros are skipped (Eden only has the Fermi macro ISA). - Submits with increment_value get Eden-side syncpoint increments, since NVN2 signals completion with semaphore releases only.
* [maxwell_3d] append inline index draw streams in bulk (#4083)simply00012026-06-271-0/+17
| | | | | | | | | Inline index draws arrive as a batch but were processed one word at a time, so each index ran through the full per-method path and got appended a byte at a time. Handle the whole batch in one pass instead, updating state once and appending all the indices together. Replay shadow control still goes word by word since it has to reload each one. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4083 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
* [video_core/maxwell3d] compute macro param address on demand (#4067)simply00012026-06-261-4/+0
| | | | | | | | | | | | | | | GetMacroAddress only reads a couple of indices per macro, but ProcessMacro was then building a full std::vector GPUVAddr> with one push_back per parameter word every submission. macro_segments already holds base, count per chunk, so GetMacroAddress can just walk it instead, drops the per-word loop, a .clear(), and a vector member. Also makes it so it returns on the first match in the macro dispatch instead of running every std::get_if check. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4067 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com>
* [video_core, hle] remove redundant parent references in system structs (#3908)lizzie2026-06-231-17/+14
| | | | | | | | | | reworked a bit to remove references of parent objects and instead pass as arguments to methods to prevent useless reloads Signed-off-by: lizzie <lizzie@eden-emu.dev> Co-authored-by: maufeat <sahyno1996@gmail.com> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3908 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev>
* [video_core] fix std::bitset<> dirty tracker OOB, fix slightly wrong index ↵lizzie2026-05-271-23/+10
| | | | | | | | | | | | | | format estimate (#4006) u8 may have been 0xff, (aka. 255), but bitset was only 255 elements, so doing bitset[255] is technically OOB additionally the max size estimate for index formats was not correct, there can be up to 256 elements with a u8 format index, not just 255 Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4006 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
* [video_core/engines/maxwell3d] memory inline DrawState to reduce indirection ↵lizzie2026-04-281-7/+6
| | | | | | | | | | | | | | | | | | on hot paths (#3758) usual indirection removal helps very slightly to codegen the idea is basically to reduce the amount of pointer deference overall in the code, and use idiomatic std::variant<>-isms to not rely on vtables/unique_ptr overhead this should allow the compiler to emit better code of course it's a tiny optimisation and only CPU side, but allows us to reduce indirection which is almost always a good thing "but youre passing more parameters to the function!!!" its literally memoized into a register my friend Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3758 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: MaranBr <maranbr@eden-emu.dev>
* [video_core] Fix Maxwell3D register processing to always mark dirty flags ↵MaranBr2026-03-171-9/+4
| | | | | | | | | | | | | | (#3712) Removed the early return in ProcessDirtyRegisters to ensure all dependent dirty flags are set even if the register value hasn't changed. This fixes flickering and vertex explosions on the Hero's Path in The Legend of Zelda: Breath of the Wild, fixes the teleport bug in The Legend of Zelda: Tears of the Kingdom, fixes the grey Luigi in Luigi's Mansion 3, and may also improve rendering in other games that rely on redundant register writes. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3712 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Co-authored-by: MaranBr <maranbr@outlook.com> Co-committed-by: MaranBr <maranbr@outlook.com>
* [video_core/engines] Macro HLE inline (#3653)lizzie2026-03-061-7/+14
| | | | | | | | | | Should slightly boost perf on android, Desktop is mainly unaffected (for now) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3653 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: DraVee <chimera@dravee.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
* [scheduler, dma, maxwell] Reduce CPU stalls in the GPU command processing ↵CamilleLaVey2026-01-181-25/+18
| | | | | | | | | | | | | | | | pipeline through multiple targeted optimizations (#3296) - Scheduler: Reduced lock scope to allow parallel command preparation across channels - DmaPusher: Added command prefetching (16-command lookahead) to improve cache hit rate - Maxwell3D: Pre-allocated macro parameter vectors to eliminate dynamic allocations and unrolls dirty register tracking loop for better cache locality - MacroEngine: Added last-executed macro cache to skip hash table lookups on hot path Co-authored-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3296 Reviewed-by: Maufeat <sahyno1996@gmail.com> Reviewed-by: DraVee <dravee@eden-emu.dev> Co-authored-by: CamilleLaVey <camillelavey99@gmail.com> Co-committed-by: CamilleLaVey <camillelavey99@gmail.com>
* [common, core] remove uneeded memory indirection overhead at startup (#3306)lizzie2026-01-161-9/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | for core stuff: just remove unique ptrs that dont need any pointer stability at all (afterall its an allocation within an allocation so yeah) for fibers: Main reasoning behind this is because virtualBuffer<> is stupidly fucking expensive and it also clutters my fstat view ALSO mmap is a syscall, syscalls are bad for performance or whatever ALSO std::vector<> is better suited for handling this kind of "fixed size thing where its like big but not THAT big" (512 KiB isn't going to kill your memory usage for each fiber...) for core.cpp stuff - inlines stuff into std::optional<> as opposed to std::unique_ptr<> (because yknow, we are making the Impl from an unique_ptr, allocating within an allocation is unnecessary) - reorganizes the structures a bit so padding doesnt screw us up (it's not perfect but eh saves a measly 44 bytes) - removes unused/dead code - uses std::vector<> instead of std::deque<> no perf impact expected, maybe some initialisation boost but very minimal impact nonethless lto gets rid of most calls anyways - the heavy issue is with shared_ptr and the cache coherency from the atomics... but i clumped them together because well, they kinda do not suffer from cache coherency - hopefully not a mistake this balloons the size of Impl to about 1.67 MB - which is fine because we throw it in the stack anyways REST OF INTERFACES: most of them ballooned in size as well, but overhead is ok since its an allocation within an alloc, no stack is used (when it comes to storing these i mean) Signed-off-by: lizzie lizzie@eden-emu.dev Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3306 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
* [meta] fix license headers (#2547)lizzie2025-09-211-0/+3
| | | | | | | Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2547 Reviewed-by: MaranBr <maranbr@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
* [cmake] enable clang-cl and WoA builds (#348)lizzie2025-09-091-6/+6
| | | | | | | | | | | | | | Compilation and CMake fixes for both Windows on ARM and clang-cl, meaning Windows can now be built on both MSVC and clang on both amd64 and aarch64. Compiling on clang is *dramatically* faster so this should be useful for CI. Co-authored-by: crueter <crueter@eden-emu.dev> Co-authored-by: crueter <crueter@crueter.xyz> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/348 Reviewed-by: CamilleLaVey <camillelavey99@gmail.com> Reviewed-by: crueter <crueter@eden-emu.dev> Co-authored-by: lizzie <lizzie@eden-emu.dev> Co-committed-by: lizzie <lizzie@eden-emu.dev>
* scope_exit: Make constexprFearlessTobi2024-02-191-1/+3
| | | | | Allows the use of the macro in constexpr-contexts. Also avoids some potential problems when nesting braces inside it.
* Core: Eliminate core/memory dependancies.Fernando Sahmkow2024-01-181-1/+0
|
* OpenGL: Add GL_PRIMITIVES_GENERATED and ↵Ameer J2023-12-191-8/+16
| | | | GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries
* Buffer Cache: Eliminate clears on Indirect buffersFernando Sahmkow2023-11-181-1/+1
|
* Query Cache: Fix guest side sample countingFernando Sahmkow2023-09-231-6/+0
|
* Query Cache: address issuesFernando Sahmkow2023-09-231-6/+0
|
* Query Cachge: Fully rework Vulkan's query cacheFernando Sahmkow2023-09-231-51/+23
|
* Maxwell3D: Improve Index buffer size estimation.Fernando Sahmkow2023-08-271-1/+5
|
* Use spans over guest memory where possible instead of copying data.Kelebek12023-07-021-3/+1
|
* android: video_core: Disable some problematic things on GPU Normal.bunnei2023-06-031-0/+12
|
* Maxwell3D: only update parameters on HighFernando Sahmkow2023-04-291-0/+3
|
* maxwell_3d: fix out of bounds array access in size estimationLiam2023-04-221-4/+6
|
* Merge pull request #9802 from Kelebek1/wait_data_cachebunnei2023-02-161-0/+4
|\ | | | | Re-add the invalidate_texture_data_cache register
| * Reimplement the invalidate_texture_data_cache registerKelebek12023-02-141-0/+4
| |
* | remove static from pointer sized or smaller types for aesthetics, change ↵arades792023-02-141-1/+1
| | | | | | | | | | | | constexpr static to static constexpr for consistency Signed-off-by: arades79 <scravers@protonmail.com>
* | add static lifetime to constexpr values to force compile time evaluation ↵arades792023-02-141-1/+1
|/ | | | | | where possible Signed-off-by: arades79 <scravers@protonmail.com>
* Merge pull request #9556 from vonchenplus/draw_textureliamwhite2023-01-191-0/+1
|\ | | | | video_core: Implement maxwell3d draw texture method
| * video_core: Implement maxwell3d draw texture methodFeng Chen2023-01-051-0/+1
| |
* | Demote maxwell3d Firmware4 call log to debugKelebek12023-01-181-1/+1
| |
* | video_core: Cache GPU internal writes.Fernando Sahmkow2023-01-051-6/+1
|/
* Video_core: Address feedbackFernando Sahmkow2023-01-041-7/+6
|