Ryujinx/Ryujinx.Graphics.Shader/CodeGen/Glsl/HelperFunctions/GlobalMemory.glsl

36 lines
1,004 B
Text
Raw Normal View History

uvec2 Helper_TranslateAddress(uvec2 address)
{
uvec4* buffer_regions = (uvec4*)packPtr(s_page_table.xy);
uint64_t address64 = packUint2x32(address);
uint count = buffer_regions[0].x;
uint left = 0;
uint right = count;
while (left != right)
{
uint middle = left + ((right - left) >> 1);
uint offset = middle * 2;
uvec4 guest_info = buffer_regions[1 + offset];
uvec4 host_info = buffer_regions[2 + offset];
uint64_t start_address = packUint2x32(guest_info.xy);
uint64_t end_address = packUint2x32(guest_info.zw);
if (address64 >= start_address && address64 < end_address)
{
uint64_t host_address = packUint2x32(host_info.xy);
return unpackUint2x32((address64 - start_address) + host_address);
}
if (address64 < start_address)
{
right = middle;
}
else
{
left = middle + 1;
}
}
return uvec2(0, 0);
}