Drivers and hardware may provide more optimal paths for untyped buffers compared to typed. Also, ByteAddressBuffer may be bound via a root descriptor in Direct3D 12, greatly simplifying the binding logic. ByteAddressBuffer also doesn't have the 128 * 2^20 element count limit that typed and structured buffers have, and doesn't require the structure stride to be specified at resource creation time in Direct3D 11.
42 lines
1.8 KiB
Plaintext
42 lines
1.8 KiB
Plaintext
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2022 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#include "texture_load.xesli"
|
|
|
|
XE_TEXTURE_LOAD_ENTRY(16)
|
|
{
|
|
// 1 thread = 2 blocks.
|
|
XeTextureLoadInfo load_info = XeTextureLoadGetInfo(pass_push_consts_xe);
|
|
uint3_xe block_index = in_global_thread_id_xe << uint3_xe(1u, 0u, 0u);
|
|
dont_flatten_xe
|
|
if (any(greater_than_equal_xe(block_index.xy, load_info.size_blocks.xy))) {
|
|
return;
|
|
}
|
|
uint block_offset_host =
|
|
load_info.host_offset +
|
|
uint(XeTextureHostLinearOffset(int3_xe(block_index), load_info.host_pitch,
|
|
load_info.size_blocks.y, 16u));
|
|
uint block_offset_guest =
|
|
XeTextureLoadSourceAddress(load_info, block_index, 4u);
|
|
byte_buffer_align16_store16_xe(
|
|
xe_texture_load_dest, block_offset_host,
|
|
XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,
|
|
block_offset_guest),
|
|
load_info.endian_32));
|
|
block_offset_host += 16u;
|
|
block_offset_guest +=
|
|
XeTextureLoadLocalXAddressXor(1u, 4u, load_info.is_tiled);
|
|
byte_buffer_align16_store16_xe(
|
|
xe_texture_load_dest, block_offset_host,
|
|
XeEndianSwap32(byte_buffer_align16_load16_xe(xe_texture_load_source,
|
|
block_offset_guest),
|
|
load_info.endian_32));
|
|
}
|
|
entry_code_end_compute_xe
|