<feed xmlns='http://www.w3.org/2005/Atom'>
<title>eglantine-cirakg/src/video_core/textures, branch nx2</title>
<subtitle>Mirror of github.com/cira0100/Eglantine-public nx2, a fork of Djihads80/Eglantine.</subtitle>
<id>https://git.cirakg.xyz/eglantine-cirakg/atom?h=nx2</id>
<link rel='self' href='https://git.cirakg.xyz/eglantine-cirakg/atom?h=nx2'/>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/'/>
<updated>2026-11-02T19:53:47+00:00</updated>
<entry>
<title>video_core: read texture handles as header offsets only on Switch 2</title>
<updated>2026-11-02T19:53:47+00:00</updated>
<author>
<name>Sssnowyyy</name>
<email>78863999+Sssnowyyy@users.noreply.github.com</email>
</author>
<published>2026-11-02T16:30:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=e46c6cbfb0f6735ca35f1150338c300f3c9c18fe'/>
<id>urn:sha1:e46c6cbfb0f6735ca35f1150338c300f3c9c18fe</id>
<content type='text'>
049c9633ed made TextureHeaderIndex take index / 32 for any texture index past the
pool that is a multiple of 32, in VisitImageView and in the shader environment.
That was written for Switch 2 handles that hold a header byte offset, but it ran
for Switch 1 games too, where such an out-of-range index used to give a null view
(and fail the shader environment's range check) and now binds an unrelated
header. Pass whether the memory manager uses native tiling, which is how Switch 2
titles are set up, and keep the previous behaviour otherwise.

Follow-up to 049c9633ed.

Assisted-by: Claude Sonnet 5.5 (implementation and commit message)
</content>
</entry>
<entry>
<title>Merge remote-tracking branch 'origin/fix/nx2-texture-header-offset-handles' into test/linux-all-prs</title>
<updated>2026-11-01T18:26:13+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-11-01T18:26:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=b91817655ac7e72ae871ff668cea49da8082035e'/>
<id>urn:sha1:b91817655ac7e72ae871ff668cea49da8082035e</id>
<content type='text'>
</content>
</entry>
<entry>
<title>textures: ASTC opaque scan from a table of block modes</title>
<updated>2026-10-31T22:56:53+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-31T22:56:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=8266a6a91b7a9aed8ec197676d9c346451eb53cd'/>
<id>urn:sha1:8266a6a91b7a9aed8ec197676d9c346451eb53cd</id>
<content type='text'>
Choosing BC1 or BC3 for an ASTC texture re-compressed on the GPU scans
every block of it for an alpha endpoint mode when the image is made, on
the GPU thread. Each block's mode was decoded bit by bit
(DecodeBlockInfo): 224 us per new ASTC texture on Mario Kart World's
title screen, which streams textures in by the thousand, and ~10% of the
time in its frames over 100 ms.

DecodeBlockInfo reads nothing but a block's 11 mode bits, so its result
for all 2048 of them is worked out once; the scan takes the partition
count and endpoint modes straight from the block's first word.

Same answer as before for all 2^29 values of the bits the scan reads
(random data in the rest, 538M blocks). A 4 MiB opaque texture scans in
1.6 ms instead of 12 ms; the title screen's new ASTC textures in 37 us
each instead of 224.
</content>
</entry>
<entry>
<title>nx2: read texture handles that hold a header byte offset</title>
<updated>2026-10-31T14:31:41+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-31T14:31:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=049c9633edd9b3f7eaed6b4b3a18a4ead0cd18b7'/>
<id>urn:sha1:049c9633edd9b3f7eaed6b4b3a18a4ead0cd18b7</id>
<content type='text'>
Switch Sports' scenery shaders take their 64-bit texture handles from a uniform
register, and the texture part of those handles is the header's byte offset in the
pool (index * 32), not its index: 0x96e46000 names header 8960 (a 640x152 2D
texture), while the plain reading, 286720, runs far past the 33067-entry pool. Eden
skipped them at draw time (null view) and built the shaders for a garbage header, so
the island's ground, cliffs and buildings drew black.

When a handle's index falls past the pool but index / 32 lands inside it, take that
header, both when building the shader and when binding the view. Handles that
already resolve keep their meaning.
</content>
</entry>
<entry>
<title>ASTC: decode and re-compress to BC1/BC3 on the GPU; texture cache budget</title>
<updated>2026-10-29T00:43:01+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-29T00:43:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=0d5534a2883329183ae8aa89b3fe1c7b67291ece'/>
<id>urn:sha1:0d5534a2883329183ae8aa89b3fe1c7b67291ece</id>
<content type='text'>
- accelerate_astc=Gpu with astc_recompression=Bc1/Bc3 now decodes ASTC
  with the GPU decoder into a temporary RGBA8 image (dedicated memory,
  freed once the GPU is past it) and compresses it with a new compute
  shader (bc_encoder.comp: bounding-box endpoints along the colours'
  covariance, inset 1/16, nearest palette entry; BC3 alpha ramp; BC1
  punch-through), then copies the blocks into the image. No CPU decode,
  so streamed textures are ready the frame they are first used instead
  of showing placeholders for seconds; the decode pass no longer waits
  for the GPU on this path.
- The CPU path (CpuAsynchronous) fills a new image with zero blocks
  before its first decode instead of showing stale VRAM, and the
  transcode pool is a quarter of the hardware threads.
- Switch 2 titles: collector thresholds near the device budget, re-read
  every 60 frames from VK_EXT_memory_budget (another game shrank it from
  7.0 to 5.4 GB).
- EDEN_NX2_HIDE_WINDOW=0 now leaves the window visible.
</content>
</entry>
<entry>
<title>Texture cache: stop the churn, the per-frame image leak and garbage textures</title>
<updated>2026-10-28T23:32:48+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-28T23:32:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=2bd0285a383652b086f51ef779f083f0bce62670'/>
<id>urn:sha1:2bd0285a383652b086f51ef779f083f0bce62670</id>
<content type='text'>
- Unmapped GPU addresses get a stand-in CPU address fixed by the GPU
  address. A fresh one per lookup meant FindImage never found an image
  there again: title 1's bloom chain at 0xf0000-0x15b600 was re-created
  on every use (~5,400 images per 600 frames), filling VRAM.
- ASTC whose blocks carry no alpha (exact endpoint-mode scan reusing the
  decoder's block parsing) is re-compressed to BC1 instead of BC3, half
  the size; about 70% of title 1's ASTC qualifies. Copies between BC1
  and BC3 hosts are skipped (their guest data is uploaded instead).
  EDEN_NX2_ASTC_BC1=0 turns it off.
- Deleting an image cancels every decode still queued for it. An image
  re-decoded mid-decode has two; the first to finish cleared IsDecoding,
  the second was not cancelled and was uploaded into the next image to
  take the slot: garbage textures (the title logo, road patches) and a
  staging overrun when that image was smaller.
- Diagnostics: images created and deleted per 600 frames by shape,
  collector deletions, async decodes, BC1/BC3 split; collector
  thresholds overridable (EDEN_NX2_TC_EXPECTED_MIB/CRITICAL_MIB); GPU
  ASTC decode wait timing (EDEN_NX2_ASTC_FLUSH=1 submits without it).

Title 1 attract loop: device memory 4.8-5.1 GB instead of 5.9-6.1 GB, no
decoded textures evicted, ~17 -&gt; 22-23 fps.
</content>
</entry>
<entry>
<title>ASTC transcode pool: an eighth of the hardware threads (at least 2)</title>
<updated>2026-10-28T21:15:59+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-28T21:15:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=32e5578d7a19aaf4ebca4e25eb0dbf87a7ab0ab9'/>
<id>urn:sha1:32e5578d7a19aaf4ebca4e25eb0dbf87a7ab0ab9</id>
<content type='text'>
With half (8 on a Ryzen 7 8845HS), re-compressing streamed ASTC textures to
BC3 took ~3.5 cores away from the six emulated cores and the GPU thread.
Title 1 attract loop, 65-150 s: 8 threads 16.0 fps, 4 threads 12.6, 2
threads 18.9 (scene noise is large). EDEN_NX2_TRANSCODE_THREADS overrides.
</content>
</entry>
<entry>
<title>Switch 2: present vi2 native images and capture frames</title>
<updated>2026-10-28T00:53:14+00:00</updated>
<author>
<name>Takoroka</name>
<email>137927095+Takoroka@users.noreply.github.com</email>
</author>
<published>2026-10-28T00:53:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=3f5bee600839a7593e98e0cb1231f09c29373ac8'/>
<id>urn:sha1:3f5bee600839a7593e98e0cb1231f09c29373ac8</id>
<content type='text'>
vi2 229 composites the presented native image (block-linear RGBA8 in the
console's GOB layout, from changes.patch) at its SMMU address, which the GPU
memory registry now records per mapped range. EDEN_NX2_FRAME_CAPTURE=&lt;dir&gt;
saves every 120th presented frame as a TGA for hidden test runs. Also mirrors
releases for every two-page gsv semaphore region and logs gsv sub 101 ranges.
</content>
</entry>
<entry>
<title>[vulkan] Removal of QCOM sampler limiters + CustomBorderColor and ColorBorderSwizzle adjustments (#4301)</title>
<updated>2026-08-25T18:03:18+00:00</updated>
<author>
<name>CamilleLaVey</name>
<email>camillelavey99@gmail.com</email>
</author>
<published>2026-08-25T18:03:18+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=0295dc5fff9b2977e753e7c126cc870abb07ee3f'/>
<id>urn:sha1:0295dc5fff9b2977e753e7c126cc870abb07ee3f</id>
<content type='text'>
This PR removes the artificial limit added for QCOM drivers based on a sampler budget limit (based on #3280 work), removes the ban on CustomBorderColor/BorderColorSwizzle for also QCOM driver, reduce the amount of combination required to created a sampler with custom border color/ color border swizzle; adds cases on R16 formats not able to swizzle on BGR565 formats; degrades samplers and color combinations when there's no color border swizzle available; fixes the srgb (LUT) values from legacy and now all the color variations are cached in the same key, instead of having 7 different handlers for them. In resume, rather than performance (due to the reduced amount of process on duplicated/ synced code on pipeline/texture cache), it's a graphica accuracy work that will improve image quality at the cost of almost 0 performance hit, rather than certain hitch if the color combination wasn't cached before. This applies to all platform.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4301
Reviewed-by: Samuel &lt;lizzie@eden-emu.dev&gt;
Reviewed-by: MaranBr &lt;maranbr@eden-emu.dev&gt;
</content>
</entry>
<entry>
<title>[common, settings] Fixes misaligned Aniso levels (#4295)</title>
<updated>2026-08-23T22:06:11+00:00</updated>
<author>
<name>lizzie</name>
<email>lizzie@eden-emu.dev</email>
</author>
<published>2026-08-23T22:06:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cirakg.xyz/eglantine-cirakg/commit/?id=d9336ce6ce4c043a20862e567711c7b0bc1e11b6'/>
<id>urn:sha1:d9336ce6ce4c043a20862e567711c7b0bc1e11b6</id>
<content type='text'>
PR/Commit Owner: CamilleLaVey

Just quick fixes to ANISO bugged level selector, removes x32 and x64 from choices, also fixes the none value to actully use default.

Co-authored-by: CamilleLaVey &lt;camillelavey99@gmail.com&gt;
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4295
Reviewed-by: Maufeat &lt;sahyno1996@gmail.com&gt;
Reviewed-by: CamilleLaVey &lt;camillelavey99@gmail.com&gt;
</content>
</entry>
</feed>
