librocdxg: Integrate DXCore loader into WDDM thunks

Replace direct D3DKMT API calls with DXCORE_CALL macro in WDDM
thunk layer. This enables dynamic loading of DXCore functions
while maintaining the same API interface.

Updated thunk functions:
- MapGpuVirtualAddress, CreateAllocation, DestroyAllocation
- ReserveGpuVirtualAddress, FreeGpuVirtualAddress
- MakeResident, Evict, ShareObjects
- QueryResourceInfoFromNtHandle, OpenResourceFromNtHandle

All existing functionality is preserved while adding flexibility
for runtime DXCore availability detection.

Signed-off-by: Chengjun Yao <Chengjun.Yao@amd.com>
Signed-off-by: Yang Su <Yang.Su2@amd.com>
Reviewed-by: Shi.Leslie <Yuliang.Shi@amd.com>
このコミットが含まれているのは:
Chengjun Yao
2025-09-10 10:58:06 +08:00
committed by Frank Min
コミット 15ff43c4ce
3個のファイルの変更25行の追加24行の削除
+1
ファイルの表示
@@ -35,6 +35,7 @@
#include "impl/wddm/va_mgr.h"
#include "impl/wddm/types.h"
#include "impl/wddm/device.h"
#include "dxcore_loader.h"
wsl::thunk::WDDMDevice* get_wddmdev(uint32_t node_id);
uint32_t get_num_wddmdev();
バイナリ
ファイルの表示
バイナリファイルは表示されません。
+24 -24
ファイルの表示
@@ -88,7 +88,7 @@ static NTSTATUS WDDMQueryAdapter(D3DKMT_HANDLE adapter, KMTQUERYADAPTERINFOTYPE
args.pPrivateDriverData = data;
args.PrivateDriverDataSize = size;
return D3DKMTQueryAdapterInfo(&args);
return DXCORE_CALL(D3DKMTQueryAdapterInfo(&args));
}
uint64_t WDDMDevice::VramAvail(void) {
@@ -107,7 +107,7 @@ uint64_t WDDMDevice::VramAvail(void) {
stats.Type = D3DKMT_QUERYSTATISTICS_SEGMENT;
stats.AdapterLuid = adapter_luid_;
stats.QuerySegment.SegmentId = 0;
ret = D3DKMTQueryStatistics(&stats);
ret = DXCORE_CALL(D3DKMTQueryStatistics(&stats));
if (ret == 0)
usedVis = stats.QueryResult.SegmentInformation.BytesResident;
@@ -117,7 +117,7 @@ uint64_t WDDMDevice::VramAvail(void) {
stats.AdapterLuid = adapter_luid_;
stats.QuerySegment.SegmentId = 1;
ret = D3DKMTQueryStatistics(&stats);
ret = DXCORE_CALL(D3DKMTQueryStatistics(&stats));
if (ret == 0)
usedInv = stats.QueryResult.SegmentInformation.BytesResident;
@@ -128,7 +128,7 @@ bool WDDMDevice::CreateDevice(void) {
D3DKMT_CREATEDEVICE args = {0};
args.hAdapter = adapter_;
NTSTATUS ret = D3DKMTCreateDevice(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTCreateDevice(&args));
if (ret == STATUS_SUCCESS) {
device_ = args.hDevice;
return true;
@@ -142,7 +142,7 @@ bool WDDMDevice::DestroyDevice(void) {
D3DKMT_DESTROYDEVICE args = {0};
args.hDevice = device_;
NTSTATUS ret = D3DKMTDestroyDevice(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTDestroyDevice(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -155,7 +155,7 @@ bool WDDMDevice::CreatePagingQueue(void) {
args.hDevice = device_;
args.Priority = D3DDDI_PAGINGQUEUE_PRIORITY_NORMAL;
NTSTATUS ret = D3DKMTCreatePagingQueue(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTCreatePagingQueue(&args));
if (ret == STATUS_SUCCESS) {
page_queue_ = args.hPagingQueue;
page_syncobj_ = args.hSyncObject;
@@ -172,7 +172,7 @@ bool WDDMDevice::DestroyPagingQueue(void) {
D3DDDI_DESTROYPAGINGQUEUE args = {0};
args.hPagingQueue = page_queue_;
NTSTATUS ret = D3DKMTDestroyPagingQueue(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTDestroyPagingQueue(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -201,7 +201,7 @@ void WDDMDevice::SetPowerOptimization(bool restore) {
d3dkmt_escape.PrivateDriverDataSize = priv_size;
d3dkmt_escape.Flags.HardwareAccess = true;
NTSTATUS status = D3DKMTEscape(&d3dkmt_escape);
NTSTATUS status = DXCORE_CALL(D3DKMTEscape(&d3dkmt_escape));
pr_debug("status %d, restore %d\n", status, restore);
free(priv_data);
}
@@ -239,7 +239,7 @@ void *WDDMDevice::Lock(D3DKMT_HANDLE handle) {
args.hDevice = device_;
args.hAllocation = handle;
NTSTATUS ret = D3DKMTLock2(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTLock2(&args));
if (ret == STATUS_SUCCESS)
return args.pData;
@@ -252,7 +252,7 @@ bool WDDMDevice::Unlock(D3DKMT_HANDLE handle) {
args.hDevice = device_;
args.hAllocation = handle;
NTSTATUS ret = D3DKMTUnlock2(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTUnlock2(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -287,7 +287,7 @@ bool WDDMDevice::CreateContext(int engine, D3DKMT_HANDLE *handle) {
else
args.Flags.DisableGpuTimeout = thunk_proxy::ShouldDisableGpuTimeout(engine, &device_info_);
NTSTATUS ret = D3DKMTCreateContextVirtual(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTCreateContextVirtual(&args));
if (ret == STATUS_SUCCESS) {
*handle = args.hContext;
free(priv_data);
@@ -304,7 +304,7 @@ bool WDDMDevice::DestroyContext(D3DKMT_HANDLE handle) {
D3DKMT_DESTROYCONTEXT args = {0};
args.hContext = handle;
NTSTATUS ret = D3DKMTDestroyContext(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTDestroyContext(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -321,7 +321,7 @@ bool WDDMDevice::GpuWait(WDDMQueue *queue, const D3DKMT_HANDLE *syncobjs,
args.ObjectHandleArray = syncobjs;
args.MonitoredFenceValueArray = values;
NTSTATUS ret = D3DKMTWaitForSynchronizationObjectFromGpu(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTWaitForSynchronizationObjectFromGpu(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -337,7 +337,7 @@ bool WDDMDevice::GpuSignal(D3DKMT_HANDLE context, const D3DKMT_HANDLE *syncobjs,
args.ObjectHandleArray = syncobjs;
args.MonitoredFenceValueArray = value;
NTSTATUS ret = D3DKMTSignalSynchronizationObjectFromGpu(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTSignalSynchronizationObjectFromGpu(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -354,7 +354,7 @@ bool WDDMDevice::CpuWait(const D3DKMT_HANDLE *syncobjs, uint64_t *value,
args.FenceValueArray = value;
args.Flags.WaitAny = wait_any;
NTSTATUS ret = D3DKMTWaitForSynchronizationObjectFromCpu(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTWaitForSynchronizationObjectFromCpu(&args));
if (ret == STATUS_SUCCESS)
return true;
@@ -378,7 +378,7 @@ bool WDDMDevice::CreateSyncobj(D3DKMT_HANDLE *handle, uint64_t **addr) {
args.Info.Type = D3DDDI_MONITORED_FENCE;
args.Info.MonitoredFence.EngineAffinity = 1 << 0;
NTSTATUS ret = D3DKMTCreateSynchronizationObject2(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTCreateSynchronizationObject2(&args));
if (ret == STATUS_SUCCESS) {
*handle = args.hSyncObject;
*addr = (uint64_t *)args.Info.MonitoredFence.FenceValueCPUVirtualAddress;
@@ -397,7 +397,7 @@ void WDDMDevice::DestroySyncobj(D3DKMT_HANDLE handle) {
D3DKMT_DESTROYSYNCHRONIZATIONOBJECT args = {0};
args.hSyncObject = handle;
NTSTATUS ret = D3DKMTDestroySynchronizationObject(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTDestroySynchronizationObject(&args));
if (ret != STATUS_SUCCESS)
pr_err("fail %x\n", ret);
}
@@ -433,7 +433,7 @@ NTSTATUS WDDMCreateDevices(std::vector<WDDMDevice *> &devices)
{
bool supported = false;
D3DKMT_ENUMADAPTERS2 args = {0};
NTSTATUS ret = D3DKMTEnumAdapters2(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTEnumAdapters2(&args));
if (ret != STATUS_SUCCESS)
return ret;
@@ -446,7 +446,7 @@ NTSTATUS WDDMCreateDevices(std::vector<WDDMDevice *> &devices)
return STATUS_NO_MEMORY;
args.pAdapters = info;
ret = D3DKMTEnumAdapters2(&args);
ret = DXCORE_CALL(D3DKMTEnumAdapters2(&args));
if (ret != STATUS_SUCCESS)
goto err_out0;
@@ -517,7 +517,7 @@ void WDDMDevice::GetClockCounters(uint64_t *gpu, uint64_t *cpu) {
args.NodeOrdinal = ordinal;
args.PhysicalAdapterIndex = 0;
NTSTATUS status = D3DKMTQueryClockCalibration(&args);
NTSTATUS status = DXCORE_CALL(D3DKMTQueryClockCalibration(&args));
if (status) {
pr_debug("status %d \n", status);
} else {
@@ -589,7 +589,7 @@ bool WDDMDevice::SubmitToSwQueue(WDDMQueue *queue, uint64_t command_addr,
args.pPrivateDriverData = priv_data;
args.PrivateDriverDataSize = priv_size;
NTSTATUS ret = D3DKMTSubmitCommand(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTSubmitCommand(&args));
if (ret != STATUS_SUCCESS) {
pr_err("fail %x\n", ret);
free(priv_data);
@@ -621,7 +621,7 @@ bool WDDMDevice::CreateHwQueue(WDDMQueue *queue) {
createHwQueue.pPrivateDriverData = priv_data;
createHwQueue.PrivateDriverDataSize = priv_size;
NTSTATUS ret = D3DKMTCreateHwQueue(&createHwQueue);
NTSTATUS ret = DXCORE_CALL(D3DKMTCreateHwQueue(&createHwQueue));
if (ret != STATUS_SUCCESS) {
pr_err("fail %x\n", ret);
free(priv_data);
@@ -642,7 +642,7 @@ bool WDDMDevice::DestroyHwQueue(WDDMQueue *queue) {
.hHwQueue = queue->queue,
};
NTSTATUS ret = D3DKMTDestroyHwQueue(&DestroyHwQueue);
NTSTATUS ret = DXCORE_CALL(D3DKMTDestroyHwQueue(&DestroyHwQueue));
if (ret != STATUS_SUCCESS) {
pr_err("fail %x\n", ret);
return false;
@@ -670,7 +670,7 @@ bool WDDMDevice::SubmitToHwQueue(WDDMQueue *queue, uint64_t command_addr,
args.pPrivateDriverData = priv_data;
args.PrivateDriverDataSize = priv_size;
NTSTATUS ret = D3DKMTSubmitCommandToHwQueue(&args);
NTSTATUS ret = DXCORE_CALL(D3DKMTSubmitCommandToHwQueue(&args));
if (ret != STATUS_SUCCESS) {
pr_err("fail %x\n", ret);
free(priv_data);