[D3D12] More texture formats, rename blend map
This commit is contained in:
@@ -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_
|
||||
|
||||
25
src/xenia/gpu/d3d12/shaders/texture_load_16bpb.cs.hlsl
Normal file
25
src/xenia/gpu/d3d12/shaders/texture_load_16bpb.cs.hlsl
Normal 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));
|
||||
}
|
||||
26
src/xenia/gpu/d3d12/shaders/texture_load_8bpb.cs.hlsl
Normal file
26
src/xenia/gpu/d3d12/shaders/texture_load_8bpb.cs.hlsl
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user