[D3D12] More texture formats, rename blend map

This commit is contained in:
Triang3l
2018-08-12 22:58:45 +03:00
parent 34a1846859
commit 01a3bc32f7
5 changed files with 84 additions and 15 deletions

View File

@@ -16,4 +16,16 @@ XE_BYTE_SWAP_OVERLOAD(uint2)
XE_BYTE_SWAP_OVERLOAD(uint3)
XE_BYTE_SWAP_OVERLOAD(uint4)
#define XE_BYTE_SWAP_16_OVERLOAD(XeByteSwapType) \
XeByteSwapType XeByteSwap16(XeByteSwapType v, uint endian) { \
[flatten] if (((endian ^ (endian >> 1u)) & 1u) != 0u) { \
v = (v << 8u) | (v >> 8u); \
} \
return v; \
}
XE_BYTE_SWAP_16_OVERLOAD(uint)
XE_BYTE_SWAP_16_OVERLOAD(uint2)
XE_BYTE_SWAP_16_OVERLOAD(uint3)
XE_BYTE_SWAP_16_OVERLOAD(uint4)
#endif // XENIA_GPU_D3D12_SHADERS_BYTE_SWAP_HLSLI_

View File

@@ -0,0 +1,25 @@
#include "texture_copy.hlsli"
[numthreads(8, 32, 1)]
void main(uint3 xe_thread_id : SV_DispatchThreadID) {
// 1 thread = 4 ushort blocks.
uint3 block_index = xe_thread_id;
block_index.x <<= 2u;
[branch] if (any(block_index >= xe_texture_copy_size)) {
return;
}
uint4 block_offsets_guest =
XeTextureCopyGuestBlockOffsets(block_index, 2u, 1u);
uint4 dword_offsets_guest = block_offsets_guest & ~3u;
uint4 blocks = uint4(xe_texture_copy_source.Load(dword_offsets_guest.x),
xe_texture_copy_source.Load(dword_offsets_guest.y),
xe_texture_copy_source.Load(dword_offsets_guest.z),
xe_texture_copy_source.Load(dword_offsets_guest.w));
blocks = (blocks >> ((block_offsets_guest & 2u) << 3u)) & 0xFFFFu;
blocks = XeByteSwap16(blocks, xe_texture_copy_endianness);
uint block_offset_host = XeTextureHostLinearOffset(
block_index, xe_texture_copy_size.y, xe_texture_copy_host_pitch, 2u) +
xe_texture_copy_host_base;
xe_texture_copy_dest.Store2(block_offset_host,
blocks.xz | (blocks.yw << 16u));
}

View File

@@ -0,0 +1,26 @@
#include "texture_copy.hlsli"
[numthreads(8, 32, 1)]
void main(uint3 xe_thread_id : SV_DispatchThreadID) {
// 1 thread = 4 ubyte blocks.
uint3 block_index = xe_thread_id;
block_index.x <<= 2u;
[branch] if (any(block_index >= xe_texture_copy_size)) {
return;
}
uint4 block_offsets_guest =
XeTextureCopyGuestBlockOffsets(block_index, 1u, 0u);
uint4 dword_offsets_guest = block_offsets_guest & ~3u;
uint4 blocks = uint4(xe_texture_copy_source.Load(dword_offsets_guest.x),
xe_texture_copy_source.Load(dword_offsets_guest.y),
xe_texture_copy_source.Load(dword_offsets_guest.z),
xe_texture_copy_source.Load(dword_offsets_guest.w));
blocks = (blocks >> ((block_offsets_guest & 3u) << 3u)) & 0xFFu;
blocks <<= uint4(0u, 8u, 16u, 24u);
blocks.xy |= blocks.zw;
blocks.x |= blocks.y;
uint block_offset_host = XeTextureHostLinearOffset(
block_index, xe_texture_copy_size.y, xe_texture_copy_host_pitch, 1u) +
xe_texture_copy_host_base;
xe_texture_copy_dest.Store(block_offset_host, blocks.x);
}