Moving byte order/memory access to poly.
This commit is contained in:
@@ -118,7 +118,7 @@ void CommandProcessor::Pump() {
|
||||
// TODO(benvanik): use read_ptr_update_freq_ and only issue after moving
|
||||
// that many indices.
|
||||
if (read_ptr_writeback_ptr_) {
|
||||
XESETUINT32BE(p + read_ptr_writeback_ptr_, read_ptr_index_);
|
||||
poly::store_and_swap<uint32_t>(p + read_ptr_writeback_ptr_, read_ptr_index_);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ void CommandProcessor::ExecuteIndirectBuffer(uint32_t ptr, uint32_t length) {
|
||||
for (uint32_t __m = 0; __m < count; __m++) { \
|
||||
XETRACECP("[%.8X] %.8X", \
|
||||
packet_ptr + (1 + __m) * 4, \
|
||||
XEGETUINT32BE(packet_base + 1 * 4 + __m * 4)); \
|
||||
poly::load_and_swap<uint32_t>(packet_base + 1 * 4 + __m * 4)); \
|
||||
}
|
||||
|
||||
void CommandProcessor::AdvancePtr(PacketArgs& args, uint32_t n) {
|
||||
@@ -186,9 +186,9 @@ void CommandProcessor::AdvancePtr(PacketArgs& args, uint32_t n) {
|
||||
}
|
||||
#define ADVANCE_PTR(n) AdvancePtr(args, n)
|
||||
#define PEEK_PTR() \
|
||||
XEGETUINT32BE(p + args.ptr)
|
||||
poly::load_and_swap<uint32_t>(p + args.ptr)
|
||||
#define READ_PTR() \
|
||||
XEGETUINT32BE(p + args.ptr); ADVANCE_PTR(1);
|
||||
poly::load_and_swap<uint32_t>(p + args.ptr); ADVANCE_PTR(1);
|
||||
|
||||
uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
uint8_t* p = memory_->membase();
|
||||
@@ -339,7 +339,7 @@ uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
// Memory.
|
||||
XE_GPU_ENDIAN endianness = (XE_GPU_ENDIAN)(poll_reg_addr & 0x3);
|
||||
poll_reg_addr &= ~0x3;
|
||||
value = XEGETUINT32LE(p + GpuToCpu(packet_ptr, poll_reg_addr));
|
||||
value = poly::load<uint32_t>(p + GpuToCpu(packet_ptr, poll_reg_addr));
|
||||
value = GpuSwap(value, endianness);
|
||||
} else {
|
||||
// Register.
|
||||
@@ -434,7 +434,7 @@ uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
// Memory.
|
||||
XE_GPU_ENDIAN endianness = (XE_GPU_ENDIAN)(poll_reg_addr & 0x3);
|
||||
poll_reg_addr &= ~0x3;
|
||||
value = XEGETUINT32LE(p + GpuToCpu(packet_ptr, poll_reg_addr));
|
||||
value = poly::load<uint32_t>(p + GpuToCpu(packet_ptr, poll_reg_addr));
|
||||
value = GpuSwap(value, endianness);
|
||||
} else {
|
||||
// Register.
|
||||
@@ -475,8 +475,8 @@ uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
XE_GPU_ENDIAN endianness = (XE_GPU_ENDIAN)(write_reg_addr & 0x3);
|
||||
write_reg_addr &= ~0x3;
|
||||
write_data = GpuSwap(write_data, endianness);
|
||||
XESETUINT32LE(p + GpuToCpu(packet_ptr, write_reg_addr),
|
||||
write_data);
|
||||
poly::store(p + GpuToCpu(packet_ptr, write_reg_addr),
|
||||
write_data);
|
||||
} else {
|
||||
// Register.
|
||||
WriteRegister(packet_ptr, write_reg_addr, write_data);
|
||||
@@ -524,7 +524,7 @@ uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
XE_GPU_ENDIAN endianness = (XE_GPU_ENDIAN)(address & 0x3);
|
||||
address &= ~0x3;
|
||||
data_value = GpuSwap(data_value, endianness);
|
||||
XESETUINT32LE(p + GpuToCpu(address), data_value);
|
||||
poly::store(p + GpuToCpu(address), data_value);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -637,7 +637,7 @@ uint32_t CommandProcessor::ExecutePacket(PacketArgs& args) {
|
||||
size &= 0xFFF;
|
||||
index += 0x4000; // alu constants
|
||||
for (uint32_t n = 0; n < size; n++, index++) {
|
||||
uint32_t data = XEGETUINT32BE(
|
||||
uint32_t data = poly::load_and_swap<uint32_t>(
|
||||
p + GpuToCpu(packet_ptr, address + n * 4));
|
||||
const char* reg_name = regs->GetRegisterName(index);
|
||||
XETRACECP("[%.8X] %.8X -> %.4X %s",
|
||||
@@ -769,7 +769,7 @@ void CommandProcessor::WriteRegister(
|
||||
uint8_t* p = memory_->membase();
|
||||
uint32_t scratch_addr = regs->values[XE_GPU_REG_SCRATCH_ADDR].u32;
|
||||
uint32_t mem_addr = scratch_addr + (scratch_reg * 4);
|
||||
XESETUINT32BE(p + GpuToCpu(primary_buffer_ptr_, mem_addr), value);
|
||||
poly::store_and_swap<uint32_t>(p + GpuToCpu(primary_buffer_ptr_, mem_addr), value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ int D3D11IndexBufferResource::InvalidateRegion(
|
||||
memory_range_.host_base);
|
||||
uint32_t* dest = reinterpret_cast<uint32_t*>(res.pData);
|
||||
for (uint32_t n = 0; n < index_count; n++) {
|
||||
dest[n] = XESWAP32(src[n]);
|
||||
dest[n] = poly::byte_swap(src[n]);
|
||||
}
|
||||
} else {
|
||||
uint32_t index_count = memory_range_.length / 2;
|
||||
@@ -77,7 +77,7 @@ int D3D11IndexBufferResource::InvalidateRegion(
|
||||
memory_range_.host_base);
|
||||
uint16_t* dest = reinterpret_cast<uint16_t*>(res.pData);
|
||||
for (uint32_t n = 0; n < index_count; n++) {
|
||||
dest[n] = XESWAP16(src[n]);
|
||||
dest[n] = poly::byte_swap(src[n]);
|
||||
}
|
||||
}
|
||||
resource_cache_->context()->Unmap(handle_, 0);
|
||||
@@ -138,7 +138,7 @@ int D3D11VertexBufferResource::InvalidateRegion(
|
||||
uint32_t o = 0;
|
||||
for (uint32_t i = 0; i < count; i++) {
|
||||
for (uint32_t j = 0; j < el.size_words; j++) {
|
||||
dest_ptr[o + j] = XESWAP32(src_ptr[o + j]);
|
||||
dest_ptr[o + j] = poly::byte_swap(src_ptr[o + j]);
|
||||
}
|
||||
o += stride;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ ShaderResource::ShaderResource(const MemoryRange& memory_range,
|
||||
size_t byte_size = dword_count_ * sizeof(uint32_t);
|
||||
dwords_ = (uint32_t*)xe_malloc(byte_size);
|
||||
for (uint32_t n = 0; n < dword_count_; n++) {
|
||||
dwords_[n] = XEGETUINT32BE(memory_range.host_base + n * 4);
|
||||
dwords_[n] = poly::load_and_swap<uint32_t>(memory_range.host_base + n * 4);
|
||||
}
|
||||
|
||||
// Disassemble, for debugging.
|
||||
|
||||
@@ -307,12 +307,12 @@ void TextureResource::TextureSwap(uint8_t* dest, const uint8_t* src,
|
||||
switch (info_.endianness) {
|
||||
case XE_GPU_ENDIAN_8IN16:
|
||||
for (uint32_t i = 0; i < pitch; i += 2, src += 2, dest += 2) {
|
||||
*(uint16_t*)dest = XESWAP16(*(uint16_t*)src);
|
||||
*(uint16_t*)dest = poly::byte_swap(*(uint16_t*)src);
|
||||
}
|
||||
break;
|
||||
case XE_GPU_ENDIAN_8IN32: // Swap bytes.
|
||||
for (uint32_t i = 0; i < pitch; i += 4, src += 4, dest += 4) {
|
||||
*(uint32_t*)dest = XESWAP32(*(uint32_t*)src);
|
||||
*(uint32_t*)dest = poly::byte_swap(*(uint32_t*)src);
|
||||
}
|
||||
break;
|
||||
case XE_GPU_ENDIAN_16IN32: // Swap half words.
|
||||
|
||||
@@ -83,7 +83,7 @@ XEFORCEINLINE uint32_t GpuSwap(uint32_t value, XE_GPU_ENDIAN endianness) {
|
||||
((value >> 8) & 0x00FF00FF);
|
||||
case XE_GPU_ENDIAN_8IN32: // Swap bytes.
|
||||
// NOTE: we are likely doing two swaps here. Wasteful. Oh well.
|
||||
return XESWAP32(value);
|
||||
return poly::byte_swap(value);
|
||||
case XE_GPU_ENDIAN_16IN32: // Swap half words.
|
||||
return ((value >> 16) & 0xFFFF) | (value << 16);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user