The fragment shader CBV address was computed as gpuAddress + vsh->m_size,
but D3D12 requires constant buffer view addresses to be 256-byte aligned
(D3D12_CONSTANT_BUFFER_DATA_PLACEMENT_ALIGNMENT). When the vertex shader
constant buffer exceeds 256 bytes without being a multiple of 256, the
fragment shader reads from a misaligned address, producing corrupt uniform
values.
This causes rendering artifacts or completely black output for any shader
program where the VS constant buffer size is not a multiple of 256 bytes,
since the fragment shader receives incorrect uniform data (e.g. a non-zero
alpha reference threshold that discards all pixels).
The fix aligns the VS constant buffer size to 256 bytes before placing the
FS constants, and uses the aligned offset when computing the FS CBV address
in both the main render loop and the blitter path.
* DX12: fix invalid state when creating a BLIT_DST texture without mem block
* Only set state when it's not external texture.
---------
Co-authored-by: Branimir Karadžić <branimirkaradzic@gmail.com>
* Fix D3D12 debug crash due to validation layers SDK bug
* Change LONG to FARPROC to be technically correct
* Make requested changes:
Move windows version checking to function in bgfx.cpp
Change windowsVersionIs to also use this technique
Use bgfx code style
Specify dwOSVersionInfoSize prior to calling rtlGetVersion
* Merge both functions into one
Use bx::dlsym instead of GetProcAddress directly
Fix major & minor comparison logic
* Fix win10 version comment
* Revert rendererCreate check back to Win 0x0602
* Clean up logic as per suggestion
* Fix D3D12 VBV reading size
When `stream.m_startVertex` is not 0 we target a position past the start of the buffer, so `BufferLocation + SizeInBytes` will be past the end of the buffer, which the debug layer will complaining about.
With this fix we're only creating a view for the part of the buffer we actually need to access.
* Reordered buffer size calculation.
---------
Co-authored-by: Бранимир Караџић <branimirkaradzic@gmail.com>