Commit Graph

2460 Commits

Author SHA1 Message Date
Raffaele
26824edcfa [D3D12] Fix 4D5307DF fur textures
- Fixes issue https://github.com/xenia-canary/game-compatibility/issues/6
- Implements a copy texture logic
2026-02-26 14:22:46 +09:00
Herman S.
9c37af4621 [Vulkan] Add proper tracking to swap gamma correction render pass 2026-02-25 12:31:18 +09:00
Herman S.
6de637b794 [Vulkan] Smear scalar bools.
Addresses some shader validation warnings
2026-02-25 12:31:18 +09:00
Herman S.
74ce1c812f [Vulkan] Fix VUID-FragDepth-FragDepth-04216 validation issue 2026-02-25 12:31:18 +09:00
Herman S.
77852914ff [GPU] TextureCache lockless pre-check
lockless accessors for base_outdated/mips_outdated and skip lock
acquisition when textures appear up to date
2026-02-25 12:31:18 +09:00
Herman S.
067641668f [GPU] Fix min/max blend operations to properly apply factors
Applies factors before the MIN/MAX operation - in FSI/ROV via runtime
blending, in FBO/RTV by pre-multiplying shader output when dstFactor is
ONE only, as we don't have access to dest to provide full support as we
do in the FSI/ROV paths.
2026-02-25 09:39:03 +09:00
Herman S.
966d8f0925 [Vulkan] fix FBO path reading from output variables for alpha test
Makes FBO follow the same pattern as FSI by using function scoped
intermediate variables
2026-02-25 09:38:58 +09:00
Herman S.
2d7ca4fb39 [GPU] Remove log spam for empty region resolve issues.
Affects Forza Horizon 1 and 2, does not seem to be related to any
actual rendering issues but makes it very difficult to debug real
problems.
2026-02-25 09:11:03 +09:00
Herman S.
1e23aaf4fc Improve error handling in graphics memory init 2026-02-25 09:10:48 +09:00
Triang3l
95a5c3ee25 [GPU/WGF] Bind EDRAM to resolve dumping via ByteAddressBuffer
Simplifies binding by eliminating the need to switch between 32-bit and
64-bit views, and makes it possible to bind the EDRAM via a root descriptor
on Direct3D 12.
2026-02-18 22:40:20 +03:00
Triang3l
17bc5b48e3 [GPU/D3D12] Remove now-unused typed shared memory descriptors
All usage instances changed to ByteAddressBuffer.
2026-02-18 16:41:36 +03:00
Triang3l
80dad41454 [GPU/WGF] Use ByteAddressBuffer in precompiled shaders
Drivers and hardware may provide more optimal paths for untyped buffers
compared to typed.

Also, ByteAddressBuffer may be bound via a root descriptor in Direct3D 12,
greatly simplifying the binding logic.

ByteAddressBuffer also doesn't have the 128 * 2^20 element count limit that
typed and structured buffers have, and doesn't require the structure stride
to be specified at resource creation time in Direct3D 11.
2026-02-17 23:28:42 +03:00
Herman S.
83d776fa39 [Vulkan] Add tesselation support
Pretty much just following the D3D12 implementation
2026-02-18 00:02:21 +09:00
Herman S.
3e3aee1ef2 [App] Update title to show apu and remove vulkan incomplete warning 2026-02-17 23:50:40 +09:00
Herman S.
48c13be2d5 [Vulkan] Add gamma_render_target_as_srgb support 2026-02-17 23:35:59 +09:00
Herman S.
5d74d69aa8 [Vulkan] Alpha to coverage FSI implementation 2026-02-17 22:46:18 +09:00
Herman S.
792e61f6e2 [Vulkan] Alpha to coverage improvements
Refactor redundant code, fix 2x MSAA sample mapping and
only declare gl_FragCoord when alpha to coverage can run
2026-02-17 22:46:14 +09:00
Herman S.
cba315cf38 [Vulkan] Implement alpha to coverage (FBO)
Fixes the foliage rendering in places like Red Dead Redemption menu
2026-02-17 22:43:27 +09:00
Herman S.
75589de0a4 [Vulkan] Ensure descriptor sets always initialized for user_clip_planes 2026-02-17 22:18:21 +09:00
Herman S.
f13ee6ec38 [Vulkan] Add support for user clip planes 2026-02-17 22:18:02 +09:00
Herman S.
0b7abf0241 [Vulkan] Add resolution scaling mips support 2026-02-17 21:46:50 +09:00
Herman S.
cd7b47235d [GPU] Properly handle scaled textures and weights
Fix d3d12 logic wrt scaling weights, add vulkan impelementation for using
scaled texture offsets and fix resolution-scaled texture detection
2026-02-17 21:44:18 +09:00
Herman S.
55f0333182 [Vulkan] Fix incorrect scaling EDRAM tile span parameters
These parameters are EDRAM tile coordinates in guest space and shouldn't
be scaled. Fixes visual issues in certain games when upscaling.
2026-02-17 21:43:05 +09:00
Herman S.
5897de3eaf [Vulkan] Implement tiled_shared_memory for resolution scaling
Adds support for >3x resolution scaling to vulkan by implementing
sparse scaled resolve similar to the d3d12 implementation.
2026-02-17 21:31:25 +09:00
Herman S.
a092551735 [Vulkan/D3D12] Validate upload range bounds before vastcpy
The D3D12 backend's existing check only validated the last page of the
range. The Vulkan backend had no check at all and did not respect the
gpu_allow_invalid_upload_range cvar. Both now verify start and
end pages are mapped before copying, preventing access violations when
games reference unmapped guest physical memory during transitions.
2026-02-17 21:22:48 +09:00
Herman S.
3e1b0c715a [Vulkan] Vertex buffer residency caching
Cache vertex buffer address/size per fetch constant, invalidate on fetch
constant write, reset at frame boundaries
2026-02-17 21:22:00 +09:00
Herman S.
2ad412a141 [Vulkan] Add support for vkPipelineCache 2026-02-17 21:21:56 +09:00
Herman S.
6057b0a7c7 [Vulkan] Implement ClearCache to clear upload_buffer_pool 2026-02-17 21:10:38 +09:00
Herman S.
4d15f0afea [Vulkan] Implement same vastcpy upload_buffer optimization as d3d12 2026-02-17 21:10:13 +09:00
Herman S.
ef505fbe3d [Vulkan] add no_discard_stencil_in_transfer_pipelines support 2026-02-17 17:54:01 +09:00
Herman S.
24f90c0efc [Vulkan] Fix stencil bit transfer shaders not discarding pixels
"packed" was never set because source_depth_texture isn't created for
stencil bit output. This caused the discard logic to be skipped
resulting in stencil being incorrectly incremented on every transfer
draw until it saturated at 0xFF.

Fixes many remaining Vulkan rendering issues, e.g. Brothers, Orange Box,
Arkham Origins, many others.
2026-02-17 17:44:23 +09:00
Herman S.
878de4c352 [Vulkan] Fix sampler params 2026-02-17 17:44:08 +09:00
Herman S.
dc66d67a31 [Vulkan] Use VK_FORMAT_A2B10G10R10 for xenos::ColorRenderTargetFormat::k_2_10_10_10
Aligns with D3D12's DXGI_FORMAT_R10G10B10A2_UNORM
2026-02-17 17:43:55 +09:00
Herman S.
1a4b78e377 [Vulkan] Invalidate descriptor set bindings for incompatible sets
The code to do this was set up but it seems it was never implemented.
2026-02-17 17:43:45 +09:00
Herman S.
a716dc6fac [Vulkan] Fix kComputeWrite access mask
Access mask was incorrectly set to VK_ACCESS_SHADER_READ_BIT
2026-02-17 17:41:21 +09:00
Herman S.
5be503da77 [Vulkan] Don't try to create geometry shader for rectangle list 2026-02-17 17:40:59 +09:00
Herman S.
ec5816a278 [Vulkan] Use vertex_fetch_bitmap instead of vertex_bindings()
Avoids using cached/stale vertex binding indices
2026-02-17 17:40:26 +09:00
Herman S.
434644c301 Merge commit 'f2fabfdf0' into canary_experimental
Sync changes from master up to before the recent GPU changes, those will be
merged later
2026-02-17 16:59:38 +09:00
Herman S.
20b226dbdf [Vulkan] Update glslang to 16.0.0 and introduce compat layer 2026-02-17 15:34:23 +09:00
Herman S.
f722b6b85f [Vulkan] Workaround for glslang 11.6.0+ change in accesschain semantics 2026-02-17 14:58:10 +09:00
Herman S.
f9d4dbc8e9 [Build] Use clang 20 for clang format consistently across Win/Lin 2026-02-15 01:25:43 +09:00
goldislead
1a9613705d Rework max anisotropy override to sampler creation (D3D12/Vulkan)
Revert ac6fd65 fetch additions and implement context-sensitive AF override.
2026-02-07 17:47:12 +01:00
Stayd
ac6fd65385 [GPU] Add anisotropic filtering override 2026-01-28 08:28:53 +01:00
Triang3l
c7f61342d7 [GPU/D3D12] Convert gamma-as-linear red to gamma in transfers to stencil
Co-authored-by: Herman S. <429230+has207@users.noreply.github.com>
2026-01-20 12:53:20 +03:00
Triang3l
0a19234b4e [GPU/D3D12] Add forgotten gamma conversion format check 2026-01-19 21:08:15 +03:00
Triang3l
cec9ca0ef2 [GPU] 8-bit PWL gamma RT as linear 16-bit UNorm on the host
With render target HLE, directly store linear values as R16G16B16A16_UNORM
without gamma conversion, as this format provides more than enough bits
(need at least 11 per component due to the maximum scale being 2^3 in the
piecewise linear gamma curve) to represent linear values without precision
loss.

This makes blending work correctly in linear space, improving quality of
transparency, lighting passes, and fixing issues such as transparent parts
of impact and footstep decals in 4D5307E6 being bright instead.

The new behavior is enabled by default, as it hugely improves the accuracy
of emulation of this format, that is pretty commonplace in Xbox 360 games,
with likely just a small GPU memory and bandwidth usage increase, compared
to the alternatives that were previously available on the HLE RB path.

It's currently implemented only on Direct3D 12, as most of the current GPU
emulation code is planned to be phased out and redone, and no methods other
than 8-bit with pre-conversion were implemented on Vulkan previously.

To implement on Vulkan later, same conversion as in the Direct3D 12
implementation will need to be done in ownership transfer and resolve
shaders. Currently it's somewhat inconvenient to decouple the conversion
functions in `SpirvShaderTranslator` from an instance of the translator due
to vector constant usage. Later, simpler SPIR-V generation functions may be
added (`spv::Builder` usage in general is overly verbose).

The previously default method (8-bit storage with pre-conversion in shaders
and incorrect blending) can be re-enabled by setting the
"gamma_render_target_as_unorm16" configuration option to `false`. This may
be useful if the game, for instance, switches between 8_8_8_8_GAMMA and
8_8_8_8 formats for the same data frequently, as switching will result in
EDRAM range ownership transfer data copying now. Also, the old path is
preserved for Vulkan devices not supporting R16G16B16A16_UNORM with
blending.

The other workaround that was available previously, replacing the PWL
encoding with host hardware sRGB with linear-space blending in render
target management and in texture fetching, was also inherently inaccurate
in many ways (especially when games have their own PWL encoding math, like
4541080F that displayed incorrect colors on the loading screen), and
required tracking of the encoding needed for ranges in the memory.

The sRGB workaround therefore was deleted in this commit, greatly
simplifying the code in the parts of render target, texture and memory
management and shader generation that were involved in it.
2026-01-18 16:22:22 +03:00
Triang3l
f2fabfdf04 [GPU] Change "bpe" to "bpb" (bytes per block) in comments
Forgotten in the other "element" to "block" change.
2026-01-15 20:48:26 +03:00
Triang3l
88f95a8bd6 [GPU] Change "element" name back to "block" in texture addressing
The 32_32_32_FLOAT format seems to be vertex-only, so it looks like there
can't be storage elements smaller than a single texel.

So, use a more precise name that can't be confused with "picture element"
(pixel) or "texture element" (texel) that represents a single logical pixel
rather than a storage block of pixels.
2026-01-15 11:56:45 +03:00
Triang3l
9535e610b0 [GPU] Change texture address local X offsetting back to addition
More likely to be emitted as an immediate load/store offset in host
hardware shaders.
2026-01-14 00:15:08 +03:00
Triang3l
6db6192170 [GPU] Use XOR to flip X texel group in all load/resolve shaders
For visual consistency (missed in the commit that added LocalXAddressXor).
2026-01-13 23:37:01 +03:00