diff --git a/wddm/device.h b/wddm/device.h index 30878923e9..5c6c5000f4 100644 --- a/wddm/device.h +++ b/wddm/device.h @@ -110,6 +110,7 @@ public: uint64_t PrivateApertureSize() { return device_info_.private_aperture_size; } uint64_t SharedApertureBase() { return device_info_.shared_aperture_base; } uint64_t SharedApertureSize() { return device_info_.shared_aperture_size; } + uint64_t SystemHeapSize() { return system_heap_space_size_; } uint32_t LdsSize() { return device_info_.lds_size; } uint64_t GPUCounterFrequency() { return device_info_.gpu_counter_frequency; } uint32_t GetSwsQueueSize(void) const { return device_info_.user_queue_size; } @@ -184,10 +185,18 @@ public: const thunk_proxy::DeviceInfo& DeviceInfo() const { return device_info_; } + ErrorCode ReserveIPCSysMem(gpusize size, + gpusize *out_gpu_virtual_addr, + gpusize alignment, + int &memfd, + bool lock=false); + + ErrorCode FreeIPCSysMem(gpusize gpu_addr, gpusize size, int &memfd); + ErrorCode ReserveGpuVirtualAddress(thunk_proxy::AllocDomain domain, gpusize hit_base_addr, gpusize size, - gpusize *out_gpu_virtual_addr, + gpusize *out_gpu_virtual_addr, gpusize alignment, bool lock=false); @@ -219,6 +228,8 @@ private: bool InitHandleApertureSpace(void); bool CommitSystemHeapSpace(void* addr, int64_t size, bool lock=false); bool DecommitSystemHeapSpace(void* addr, int64_t size); + bool CommitSystemHeapSpaceIPC(void* addr, int64_t size, int &fd, bool lock=false); + bool DecommitSystemHeapSpaceIPC(void* addr, int64_t size, int &memfd); bool FreeLocalHeapSpace(void); void InitVaMgr(); void InitHandleApertureMgr(); diff --git a/wddm/gpu_memory.h b/wddm/gpu_memory.h index 378a104dd6..a04f103538 100644 --- a/wddm/gpu_memory.h +++ b/wddm/gpu_memory.h @@ -63,7 +63,8 @@ union GpuMemoryCreateFlags { uint64_t locked : 1; // lock virtual address space into RAM, preventing that memory from being paged to the swap area uint64_t physical_contiguous : 1; // contiguous physical pages uint64_t imported_vram_alloc_va : 1; // import buffer form dmabuf fd and allocate valid va (not from handle aperture) - uint64_t unused : 58; + uint64_t imported_sys_memfd : 1; // allocate system memory for IPC signal + uint64_t unused : 57; }; uint64_t reserved; }; @@ -78,7 +79,8 @@ union GpuMemoryDescFlags { uint32_t is_queue_referenced : 1; uint32_t is_physical_contiguous : 1; uint32_t is_imported_vram_alloc_va : 1; // 0 - va from handle aperture; 1 - va from local heap; - uint32_t unused : 24; + uint32_t is_imported_sys_memfd : 1; // 0 - ignored; 1 - va from system heap + uint32_t unused : 23; }; uint32_t reserved; @@ -103,7 +105,7 @@ struct GpuMemoryCreateInfo { gpusize alignment; int mem_flags; int engine_flag; - int dmabuf_fd; // Import from dmabuf + int dmabuf_fd; // Import from dmabuf void *user_ptr; gpusize va_hint; @@ -162,6 +164,7 @@ public: inline bool IsLocal() const { return desc_.domain == thunk_proxy::kLocal; } inline bool IsUserMemory() const { return desc_.domain == thunk_proxy::kUserMemory; } inline bool IsSystem() const { return desc_.domain == thunk_proxy::kSystem; } + inline bool IsSysMemFd() const { return desc_.flags.is_imported_sys_memfd; } inline bool IsUserQueue() const { return desc_.domain == thunk_proxy::kUserQueue; } inline bool IsPhysicalOnly() const { return desc_.flags.is_physical_only; } inline bool IsPhysicalContiguous() const { return desc_.flags.is_physical_contiguous; } @@ -221,6 +224,8 @@ private: WinResourceHandle resource_; // Handle to a resource object that wraps the allocation. Used for shared resources + int mem_fd_; // IPC sigal's sys mem fd + DISALLOW_COPY_AND_ASSIGN(GpuMemory); };