Commit Graph

42 Commits

Author SHA1 Message Date
Herman S.
65d42843b6 Merge remote-tracking branch 'xenia-master/master' into canary_experimental 2026-03-06 23:05:24 +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
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
Margen67
4cb783bf22 Header cleanup 2025-07-19 14:42:21 -07:00
Xphalnos
5f918ef28d [Misc] Replaced const with constexpr where possible 2025-03-25 19:50:37 +01:00
Gliniak
a34944e4d2 [GPU] Added hack for AC6 floor/ground. Thanks Blackbird88 & TTFH3500
Added to prevent further builds fragmentation.
This will stay until accurate RCP will be implemented.
2023-10-28 10:28:25 +02:00
Triang3l
56f72da137 [GPU] More exact PWL texture/RT gamma conversion 2022-06-07 21:26:34 +03:00
Triang3l
7675b6b140 [DXBC] Cleanup texture/sampler name setting 2022-05-17 22:30:55 +03:00
Triang3l
14b69fdb00 [GPU] vfetch_full fetching nothing still must calculate the address 2022-01-09 16:26:05 +03:00
Triang3l
d6188c5d7e [GPU] Reuse base+index*stride in vfetch_mini instead of reloading the index GPR
The wheel shader in 4D530910 does vfetch_full to r0 with the index from r0.x, and then vfetch_mini.
Thanks @Gliniak for the finding :3
Also small formatting cleanup in commented-out code.
2022-01-09 14:58:38 +03:00
Triang3l
38b4741c8f [GPU] Mostly generic, not square-only resolution scaling 2021-12-11 21:55:33 +03:00
Triang3l
e720e0a540 [Code] Remove game names from code comments (most of at least) 2021-09-05 21:27:40 +03:00
Triang3l
538aa91015 [GPU] Primitive processor with Vulkan 1.0 base cases, 24-bit indices and clamping 2021-06-04 23:57:46 +03:00
Triang3l
9f8a432479 [DXBC] Cleanup: kSysConst_*_Vec/Comp > LoadSystemConstant 2021-05-16 17:43:18 +03:00
Triang3l
913e1e949c [GPU] Ownership-transfer-based RT cache, 3x3 resolution scaling
The ROV path is also disabled by default because of lower performance
2021-04-26 22:12:09 +03:00
Triang3l
9a74df491f [DXBC] dxbc.h with non-translator-specific parts 2021-01-04 16:15:50 +03:00
Triang3l
c7fbe0e6d5 [GPU] Scale gradients by SSAA factor 2020-12-20 16:35:15 +03:00
Triang3l
9a4643d0f2 [GPU] Non-ROV f24 trunc/round, host shader modifications, cache dir 2020-12-07 22:31:46 +03:00
Triang3l
6b988d43c7 [D3D12] Cleanup: pipeline state -> pipeline, other things 2020-11-14 16:43:18 +03:00
Triang3l
6ac4d3e0c9 [DXBC] Fix texture binding reference use-after-grow 2020-11-06 13:00:22 +03:00
Triang3l
4bb0ca0e09 [GPU] Move all xenos.h to gpu::xenos, disambiguate Dimension/TextureDimension 2020-07-11 15:54:22 +03:00
Triang3l
40e335e2a9 [D3D12] Bindless textures/samplers 2020-06-19 23:52:33 +03:00
Triang3l
8a64861ec0 [DXBC] New tfetch: pre-swizzle signs, additive LOD + refactoring 2020-06-06 19:12:34 +03:00
Triang3l
aa73d652ba [DXBC] OpenGL snorm vfetch because why not 2020-05-24 19:25:35 +03:00
Triang3l
04ca28c902 [DXBC] Unbreak signed integer vfetch + don't multiply by 1 in normalization 2020-05-23 19:04:42 +03:00
Triang3l
3879ff29b3 [DXBC/GPU] vfetch to new codegen, signed vfetch offset, fix AND with system flags 2020-05-23 17:15:11 +03:00
Triang3l
a3b4c77fdb [GPU] Add texture_util::SwizzleSigns for later 2020-05-11 16:30:09 +03:00
Triang3l
b79ba69548 [DXBC] ALU vector ops to new codegen 2020-05-10 16:33:39 +03:00
Triang3l
1799585e92 [DXBC] Control flow to new DXBC code 2020-04-25 19:30:01 +03:00
Triang3l
58c104e0cc [DXBC] SRV binding enum 2020-04-15 23:53:37 +03:00
gibbed
5bf0b34445 C++17ification.
C++17ification!

- Filesystem interaction now uses std::filesystem::path.
- Usage of const char*, std::string have been changed to
  std::string_view where appropriate.
- Usage of printf-style functions changed to use fmt.
2020-04-07 16:09:41 -05:00
Triang3l
d18e63e6e2 [D3D12] Always write original shader source in DXBC if PIX is attached 2020-02-16 18:09:22 +03:00
Triang3l
84a8dc91e4 [D3D12] Filtering between array texture layers 2019-09-03 10:14:25 +03:00
Triang3l
4731ae026b [D3D12] 3D/stacked texture layer addressing 2019-08-19 23:24:58 +03:00
Triang3l
352f12f92e [D3D12] Switch from gflags to cvars 2019-08-03 16:53:23 +03:00
Triang3l
6672997108 [D3D12] ROV early Z and full rewrite, shader scalar optimizations 2019-07-11 09:31:58 +03:00
Triang3l
cb99afffcb [D3D12] Revert changing the sign of tfetch epsilon 2019-01-29 12:41:06 +03:00
Triang3l
0c8ce2af04 [D3D12] tfetch: change epsilon sign, add 0.5 to getWeights coords 2019-01-29 12:35:22 +03:00
Triang3l
ed09cac440 [D3D12] DXBC: vfetch RoundIndex, vertex index signedness fixes 2018-12-28 08:11:34 +03:00
Triang3l
e803ee84d5 [D3D12] Bind shared memory as UAV with memexport 2018-12-22 15:39:47 +03:00
Triang3l
645f450321 [D3D12] DXBC: Fix UAV and sampler operands 2018-12-22 14:26:18 +03:00
Triang3l
cbba86fcf0 [D3D12] Split DXBC shader translator into multiple files 2018-12-19 14:24:16 +03:00