wsl/libhsakmt: refactor handling of kmd priv data
Signed-off-by: Flora Cui <flora.cui@amd.com> Reviewed-by: Longlong Yao <Longlong.Yao@amd.com> Part-of: <http://10.67.69.192/wsl/rocr-runtime/-/merge_requests/98>
Este commit está contenido en:
Archivo binario no mostrado.
+34
-16
@@ -184,7 +184,11 @@ void WDDMDevice::SetPowerOptimization(bool restore) {
|
||||
void *priv_data;
|
||||
int priv_size;
|
||||
|
||||
priv_size = thunk_proxy::CreatePowerOptPrivData(&priv_data, restore);
|
||||
priv_size = thunk_proxy::GetPowerOptPrivDataSize();
|
||||
priv_data = malloc(priv_size);
|
||||
assert(priv_data);
|
||||
memset(priv_data, 0, priv_size);
|
||||
thunk_proxy::FillinPowerOptPrivData(priv_data, restore);
|
||||
|
||||
D3DKMT_ESCAPE d3dkmt_escape;
|
||||
memset(&d3dkmt_escape, 0, sizeof(d3dkmt_escape));
|
||||
@@ -199,7 +203,7 @@ void WDDMDevice::SetPowerOptimization(bool restore) {
|
||||
|
||||
NTSTATUS status = D3DKMTEscape(&d3dkmt_escape);
|
||||
pr_debug("status %d, restore %d\n", status, restore);
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
}
|
||||
|
||||
void WDDMDevice::UpdatePageFence(uint64_t fence_value) {
|
||||
@@ -264,8 +268,11 @@ bool WDDMDevice::CreateContext(int engine, D3DKMT_HANDLE *handle) {
|
||||
if (ordinal < 0)
|
||||
return false;
|
||||
|
||||
bool FwManagedGfxState = SupportStateShadowingByCpFw();
|
||||
priv_size = thunk_proxy::CreateContextPrivData(&priv_data, FwManagedGfxState);
|
||||
priv_size = thunk_proxy::GetContextPrivDataSize();
|
||||
priv_data = malloc(priv_size);
|
||||
assert(priv_data);
|
||||
memset(priv_data, 0, priv_size);
|
||||
thunk_proxy::FillinContextPrivData(priv_data, SupportStateShadowingByCpFw());
|
||||
|
||||
D3DKMT_CREATECONTEXTVIRTUAL args = {0};
|
||||
args.hDevice = device_;
|
||||
@@ -283,11 +290,11 @@ bool WDDMDevice::CreateContext(int engine, D3DKMT_HANDLE *handle) {
|
||||
NTSTATUS ret = D3DKMTCreateContextVirtual(&args);
|
||||
if (ret == STATUS_SUCCESS) {
|
||||
*handle = args.hContext;
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
return true;
|
||||
}
|
||||
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
|
||||
pr_err("fail %x\n", ret);
|
||||
return false;
|
||||
@@ -568,7 +575,11 @@ bool WDDMDevice::SubmitToSwQueue(WDDMQueue *queue, uint64_t command_addr,
|
||||
void *priv_data;
|
||||
int priv_size;
|
||||
|
||||
priv_size = thunk_proxy::CreateSubmitPrivData(&priv_data, queue->queue, command_addr, command_size, false);
|
||||
priv_size = thunk_proxy::GetSubmitPrivDataSize();
|
||||
priv_data = malloc(priv_size);
|
||||
assert(priv_data);
|
||||
memset(priv_data, 0, priv_size);
|
||||
thunk_proxy::FillinSubmitPrivData(priv_data, queue->queue, command_addr, command_size, false);
|
||||
|
||||
D3DKMT_SUBMITCOMMAND args = {0};
|
||||
args.Commands = command_addr;
|
||||
@@ -581,11 +592,11 @@ bool WDDMDevice::SubmitToSwQueue(WDDMQueue *queue, uint64_t command_addr,
|
||||
NTSTATUS ret = D3DKMTSubmitCommand(&args);
|
||||
if (ret != STATUS_SUCCESS) {
|
||||
pr_err("fail %x\n", ret);
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
return false;
|
||||
}
|
||||
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
|
||||
if (!GpuSignal(queue->context, &queue->syncobj, &fence_value, 1))
|
||||
return false;
|
||||
@@ -597,9 +608,12 @@ bool WDDMDevice::CreateHwQueue(WDDMQueue *queue) {
|
||||
void *priv_data;
|
||||
int priv_size;
|
||||
|
||||
priv_size = thunk_proxy::GetHwQueuePrivDataSize();
|
||||
priv_data = malloc(priv_size);
|
||||
assert(priv_data);
|
||||
memset(priv_data, 0, priv_size);
|
||||
bool FwManagedGfxState = SupportStateShadowingByCpFw();
|
||||
priv_size = thunk_proxy::CreateHwQueuePrivData(&priv_data, queue->context,
|
||||
FwManagedGfxState, queue->prio);
|
||||
thunk_proxy::FillinHwQueuePrivData(priv_data, FwManagedGfxState, queue->prio);
|
||||
|
||||
D3DKMT_CREATEHWQUEUE createHwQueue = {0};
|
||||
createHwQueue.hHwContext = queue->context;
|
||||
@@ -610,11 +624,11 @@ bool WDDMDevice::CreateHwQueue(WDDMQueue *queue) {
|
||||
NTSTATUS ret = D3DKMTCreateHwQueue(&createHwQueue);
|
||||
if (ret != STATUS_SUCCESS) {
|
||||
pr_err("fail %x\n", ret);
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
return false;
|
||||
}
|
||||
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
|
||||
queue->queue = createHwQueue.hHwQueue;
|
||||
queue->syncobj = createHwQueue.hHwQueueProgressFence;
|
||||
@@ -642,7 +656,11 @@ bool WDDMDevice::SubmitToHwQueue(WDDMQueue *queue, uint64_t command_addr,
|
||||
void *priv_data;
|
||||
int priv_size;
|
||||
|
||||
priv_size = thunk_proxy::CreateSubmitPrivData(&priv_data, queue->queue, command_addr, command_size, true);
|
||||
priv_size = thunk_proxy::GetSubmitPrivDataSize();
|
||||
priv_data = malloc(priv_size);
|
||||
assert(priv_data);
|
||||
memset(priv_data, 0, priv_size);
|
||||
thunk_proxy::FillinSubmitPrivData(priv_data, queue->queue, command_addr, command_size, true);
|
||||
|
||||
D3DKMT_SUBMITCOMMANDTOHWQUEUE args = {0};
|
||||
args.hHwQueue = queue->queue;
|
||||
@@ -655,11 +673,11 @@ bool WDDMDevice::SubmitToHwQueue(WDDMQueue *queue, uint64_t command_addr,
|
||||
NTSTATUS ret = D3DKMTSubmitCommandToHwQueue(&args);
|
||||
if (ret != STATUS_SUCCESS) {
|
||||
pr_err("fail %x\n", ret);
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
return false;
|
||||
}
|
||||
|
||||
thunk_proxy::DestroyPrivData(priv_data);
|
||||
free(priv_data);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+18
-10
@@ -285,16 +285,24 @@ ErrorCode GpuMemory::CreatePhysicalMemory() {
|
||||
|
||||
const auto num_allocations = NumChunks();
|
||||
void *priv_drv_data;
|
||||
void *alloc_priv;
|
||||
void *priv_alloc_data;
|
||||
int priv_drv_data_size;
|
||||
int alloc_priv_data_size;
|
||||
int priv_alloc_data_size;
|
||||
|
||||
if (!thunk_proxy::CreatePrivateAllocInfo(NumChunks(), &priv_drv_data, &alloc_priv,
|
||||
&priv_drv_data_size, &alloc_priv_data_size))
|
||||
thunk_proxy::GetAllocPrivDataSize(&priv_drv_data_size, &priv_alloc_data_size);
|
||||
int total_size = priv_drv_data_size +
|
||||
num_allocations * priv_alloc_data_size +
|
||||
num_allocations * sizeof(D3DDDI_ALLOCATIONINFO2);
|
||||
priv_drv_data = malloc(total_size);
|
||||
if (!priv_drv_data)
|
||||
return ErrorCode::OutOfMemory;
|
||||
|
||||
memset(priv_drv_data, 0, total_size);
|
||||
thunk_proxy::FillinAllocPrivDrvData(priv_drv_data, priv_alloc_data_size);
|
||||
|
||||
priv_alloc_data = static_cast<unsigned char*>(priv_drv_data) + priv_drv_data_size;
|
||||
auto alloc_info = reinterpret_cast<D3DDDI_ALLOCATIONINFO2*>(
|
||||
static_cast<unsigned char*>(priv_drv_data) + priv_drv_data_size * num_allocations);
|
||||
static_cast<unsigned char*>(priv_alloc_data) + priv_alloc_data_size * num_allocations);
|
||||
|
||||
size_t size = desc_.size;
|
||||
uint64_t addr = desc_.gpu_addr;
|
||||
@@ -303,7 +311,7 @@ ErrorCode GpuMemory::CreatePhysicalMemory() {
|
||||
|
||||
for (size_t i = 0; i < num_allocations; i++) {
|
||||
|
||||
void* priv_data = (void*)((char*)priv_drv_data + priv_drv_data_size * i);
|
||||
void* priv_data = (void*)((char*)priv_alloc_data + priv_alloc_data_size * i);
|
||||
size_t block_size = std::min(size, WDDMDevice::GpuMemoryChunkSize);
|
||||
|
||||
if (IsUserMemory() || IsSystem()) {
|
||||
@@ -318,14 +326,14 @@ ErrorCode GpuMemory::CreatePhysicalMemory() {
|
||||
addr += block_size;
|
||||
|
||||
alloc_info[i].pPrivateDriverData = priv_data;
|
||||
alloc_info[i].PrivateDriverDataSize = priv_drv_data_size;
|
||||
alloc_info[i].PrivateDriverDataSize = priv_alloc_data_size;
|
||||
alloc_info[i].VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
|
||||
}
|
||||
|
||||
D3DKMT_CREATEALLOCATION args = {};
|
||||
args.hDevice = device_->DeviceHandle();
|
||||
args.pPrivateDriverData = alloc_priv;
|
||||
args.PrivateDriverDataSize = alloc_priv_data_size;
|
||||
args.pPrivateDriverData = priv_drv_data;
|
||||
args.PrivateDriverDataSize = priv_drv_data_size;
|
||||
args.NumAllocations = num_allocations;
|
||||
args.pAllocationInfo2 = alloc_info;
|
||||
|
||||
@@ -357,7 +365,7 @@ ErrorCode GpuMemory::CreatePhysicalMemory() {
|
||||
|
||||
resource_ = args.hResource;
|
||||
}
|
||||
thunk_proxy::DestroyPrivateAllocInfo(priv_drv_data, alloc_priv);
|
||||
free(priv_drv_data);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
Referencia en una nueva incidencia
Block a user