GS/DX11: Don't throw bad_alloc on surface creation fail
GS: Link device and host display construction/destruction
FullscreenUI: Replace HostDisplayTexture with GSTexture
GS: Purge HostDisplayTexture
GS: Move everything in HostDisplay to GSDevice
GS: Move ImGui rendering to GSDevice
GS: Get rid of reset/store API state
- Don't declare texture if it's not read from. Stops Vulkan validation
layers whinging.
- Get rid of OpenGL common_header.glsl, and use name linking instead of
leftovers from separate shader objects.
GS/HW: Only use temporary source for recursive draw
.. and don't insert it into the page map.
GS/HW: Lookup page list for depth sources
GS/HW: Avoid target copies by using shader sampling
GS/HW: Make texture cache a global pointer
GS/HW: Remove GetID() from GSTexture
It only made sense for OpenGL, was always zero in Vulkan.
GS/HW: Rewrite texture sampling hazard detection
Also avoid redundant channel shuffle setup.
GS/HW: Turn Haunting Ground CRC into an OI fix
It's silly to draw to the whole double-sized render target, but discard
half the pixels.
Also centralizes the constant setup, get rid of the duplication.
Change texture scale from vector to scalar
- Independent X and Y scaling is long gone.
- Also separate size and scale in TC lookup
Move clear value for texture to base class
Align heights to page size
- Since FRAME and Z are in page units, we can't have two targets
- overlapping within the same page.
- Stops some small resizes too.
- Test cases: Genji and Spider-Man 2 shadows.
Don't modify target TEX0 on shuffle/clear
Move upscale multiplier to uniform
Make P8 conversion page-aware
Fix incorrect depth preload shader
Improve HLE of texture shuffles
When a texture shuffle is split into two half-screen draws, we skip the
first, and draw the whole thing in the second, taking care of when both
the texture and framebuffer are offset.
GS: fixed compile error in Metal interlace shader
GS fixed more compile errors in Metal interlace shader
GS: Adjusted code indentation in interlace shader for all renderers
implemented FastMAD motion-adaptive deinterlacing for OpenGL renderer, other renderers will crash. FastMAD is replacing blend (either mode) so select blend to activate MAD under the hood
fixed an assert and assessed that one MUST select mode Blend bottom field first to enable MAD
removed forced mode 2, added separate motion thresholds for current field and alternate field motion and optimized MAD for Top-FIeld-First mode
committing kind-of broken status for review
the algorithm works well on most games, but somehow Kingdom Hearts works at half resolution
completely fixed weird artifacts on MAD, I only need to fix a 1-line offset that is causing the top of the screen to flicker
fixed flicker on first line, I still need to fine-tune some coefficients
solved all nastiness by realizing that MAD MUST work on an even resolution, so odd resolutions are rounded up. Now all games I tried look great
made MAD sensitivity adjustable inside GDDevice.h and passed to shaders as a parameters. For this purpose ZrH is now a vec4 to hold more parameters conveniently
ported MAD to DX11 and DX12
removed rounding of texture size to closest multiple of 2 and fized odd number of lines inside the shaders by also passing the vertical resolution as a parameter
improved compatibility of upper buffer offset adjustment for odd resolutions
added Vulkan support
Compensate slightly for Cd*(As + 1) - Cs*As.
Try to compensate a bit with substracting 1 (0.00392) * (Alpha + 1) from Cs.
The initial factor we chose is 1 (0.00392) as that is the minimum color Cd can be, then we multiply by alpha to get the minimum blended value it can be.
Replace Cs*As + Cd*(1 - As) with Cs*As - Cd*(As - 1).
Replace Cs*F + Cd*(1 - F) with Cs*F - Cd*(F - 1).
As - 1 or F - 1 subtraction is only done for the dual source output (hw blending part)
since we are changing the equation.
Af will be replaced with As in shader and send it to dual source output.
Also check if A*Alpha in the shader overflows, if it does then adjust the
alpha that is sent for HW blending further to compensate.
Improves Dogs life (no longer goes completely black right away, but has decal problems)
Vastly improves texture quality in Spider-Man 3 when using Framebuffer Conversion to fix the textures
Idea is to replace Ad with As when alpha write is masked,
then expand/let blend mix, accumulation blend non recursive blend or hw clr blend to
do the blending with Ad swapped as As.
We are doing this to try to bring some originally higher blending modes to lower levels
where we can do the draws with less texture barriers instead (gl/vk),
as for d3d11 this allows to run blending on the draws since previously the cases weren't handled properly,
it will be slower on d3d11 since we will be reading the frame buffer but it's better than nothing.
D3D11: It is enabled on Medium blending or higher, if draw is fbmask then it will enable
it on basic blending too.
OpenGL/Vulkan:
It is enabled based on the previous blending modes:
accumulation blend -> either minimum or basic level, depending on colclamp.
non recursive blend -> either minimum or basic level, depending on colclamp.
blend mix -> basic and higher level.
hw clr blend -> minimum and higher level.
All:
Prefer full sw blend when primitives don't overlap, sw fbmask or full barrier is used, it is more accurate.
Having this binding was redundant, as there's no "normal" texture
sampled when we're doing a channel shuffle, and it caused issues in
Vulkan when the render target or depth buffer the source.
Also fixes the Urban Chaos HLE shader.
Fixes validation errors in GT4, NFS: Carbon, Urban Chaos, probably
others too.
Alpha destination value is wrong so let us try to compensate.
Multiply Cs by (255/128) in shader.
Will work best if Cs is 0.5 or less, if it's higher than 0.5 then the closer to 1 the less accurate it gets.
Ofc it is best to use sw blending but it will help if sw blending is not present/selected for specific draw, will help d3d11 quite more.
Do hw blend for Cd*As, Cd*F, expand the clear color blend method as it is almost the same.
Most helpful for dx11 ofc, for gl/vulkan will help with rendering on lower
levels of blending without needing a barrier.
Clamp the alpha(As/Af) to 1 in the shader, it is already clamped to 1 in hw blend unit.
It should allow to better render the effects, still not fully accurate but it's closer to what we want.
Hopefully it helps D3D11 more.