atomic cas use prefetchw if available
remove useless memorybarrier remove double membarrier in wait pm4 cmd add int64 cvar use int64 cvar for x64 feature mask Rework some functions that were frontend bound according to vtune placing some of their code in different noinline functions, profiling after indicating l1 cache misses decreased and perf of func increased remove long vpinsrd dep chain code for conversion.h, instead do normal load+bswap or movbe if avail Much faster entry table via split_map, code size could be improved though GetResolveInfo was very large and had impact on icache, mark callees as noinline + msvc pragma optimize small use log2 shifts instead of integer divides in memory minor optimizations in PhysicalHeap::EnableAccessCallbacks, the majority of time in the function is spent looping, NOT calling Protect! Someone should optimize this function and rework the algo completely remove wonky scheduling log message, it was spammy and unhelpful lock count was unnecessary for criticalsection mutex, criticalsection is already a recursive mutex brief notes i gotta run
This commit is contained in:
@@ -216,6 +216,7 @@ class BaseHeap {
|
||||
uint32_t heap_base_;
|
||||
uint32_t heap_size_;
|
||||
uint32_t page_size_;
|
||||
uint32_t page_size_shift_;
|
||||
uint32_t host_address_offset_;
|
||||
uint32_t unreserved_page_count_;
|
||||
xe::global_critical_region global_critical_region_;
|
||||
@@ -270,18 +271,36 @@ class PhysicalHeap : public BaseHeap {
|
||||
void EnableAccessCallbacks(uint32_t physical_address, uint32_t length,
|
||||
bool enable_invalidation_notifications,
|
||||
bool enable_data_providers);
|
||||
template <bool enable_invalidation_notifications>
|
||||
XE_NOINLINE void EnableAccessCallbacksInner(
|
||||
const uint32_t system_page_first, const uint32_t system_page_last,
|
||||
xe::memory::PageAccess protect_access) XE_RESTRICT;
|
||||
|
||||
// Returns true if any page in the range was watched.
|
||||
bool TriggerCallbacks(global_unique_lock_type global_lock_locked_once,
|
||||
uint32_t virtual_address, uint32_t length, bool is_write,
|
||||
bool unwatch_exact_range, bool unprotect = true);
|
||||
uint32_t virtual_address, uint32_t length,
|
||||
bool is_write, bool unwatch_exact_range,
|
||||
bool unprotect = true);
|
||||
|
||||
uint32_t GetPhysicalAddress(uint32_t address) const;
|
||||
|
||||
uint32_t SystemPagenumToGuestPagenum(uint32_t num) const {
|
||||
return ((num << system_page_shift_) - host_address_offset()) >> page_size_shift_;
|
||||
}
|
||||
|
||||
uint32_t GuestPagenumToSystemPagenum(uint32_t num) {
|
||||
num <<= page_size_shift_;
|
||||
num += host_address_offset();
|
||||
num >>= system_page_shift_;
|
||||
return num;
|
||||
}
|
||||
protected:
|
||||
VirtualHeap* parent_heap_;
|
||||
|
||||
uint32_t system_page_size_;
|
||||
uint32_t system_page_count_;
|
||||
uint32_t system_page_shift_;
|
||||
uint32_t padding1_;
|
||||
|
||||
struct SystemPageFlagsBlock {
|
||||
// Whether writing to each page should result trigger invalidation
|
||||
@@ -458,9 +477,9 @@ class Memory {
|
||||
// TODO(Triang3l): Implement data providers - this is why locking depth of 1
|
||||
// will be required in the future.
|
||||
bool TriggerPhysicalMemoryCallbacks(
|
||||
global_unique_lock_type global_lock_locked_once,
|
||||
uint32_t virtual_address, uint32_t length, bool is_write,
|
||||
bool unwatch_exact_range, bool unprotect = true);
|
||||
global_unique_lock_type global_lock_locked_once, uint32_t virtual_address,
|
||||
uint32_t length, bool is_write, bool unwatch_exact_range,
|
||||
bool unprotect = true);
|
||||
|
||||
// Allocates virtual memory from the 'system' heap.
|
||||
// System memory is kept separate from game memory but is still accessible
|
||||
@@ -509,10 +528,10 @@ class Memory {
|
||||
const void* host_address);
|
||||
|
||||
bool AccessViolationCallback(global_unique_lock_type global_lock_locked_once,
|
||||
void* host_address, bool is_write);
|
||||
void* host_address, bool is_write);
|
||||
static bool AccessViolationCallbackThunk(
|
||||
global_unique_lock_type global_lock_locked_once,
|
||||
void* context, void* host_address, bool is_write);
|
||||
global_unique_lock_type global_lock_locked_once, void* context,
|
||||
void* host_address, bool is_write);
|
||||
|
||||
std::filesystem::path file_name_;
|
||||
uint32_t system_page_size_ = 0;
|
||||
|
||||
Reference in New Issue
Block a user