in skiko/src/awtMain/cpp/windows/InternalDirectXApi.cc [189:260]
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_graphicapi_InternalDirectXApi_createDirectXOffscreenDevice(
JNIEnv *env, jobject redrawer, jlong adapterPtr) {
gr_cp<IDXGIFactory4> deviceFactory;
if (!SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(&deviceFactory)))) {
return 0;
}
if (adapterPtr == 0) {
return 0;
}
gr_cp<IDXGIAdapter1> adapter((IDXGIAdapter1 *) adapterPtr);
D3D_FEATURE_LEVEL maxSupportedFeatureLevel = D3D_FEATURE_LEVEL_12_0;
D3D_FEATURE_LEVEL featureLevels[] = {
D3D_FEATURE_LEVEL_12_1,
D3D_FEATURE_LEVEL_12_0
};
for (int i = 0; i < _countof(featureLevels); i++) {
if (SUCCEEDED(D3D12CreateDevice(adapter.get(), featureLevels[i], _uuidof(ID3D12Device), nullptr))) {
maxSupportedFeatureLevel = featureLevels[i];
break;
}
}
gr_cp<ID3D12Device> device;
if (!SUCCEEDED(D3D12CreateDevice(adapter.get(), maxSupportedFeatureLevel, IID_PPV_ARGS(&device)))) {
return 0;
}
// Create the command queue
gr_cp<ID3D12CommandQueue> queue;
D3D12_COMMAND_QUEUE_DESC queueDesc = {};
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;
if (!SUCCEEDED(device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&queue)))) {
return 0;
}
ID3D12CommandAllocator* commandAllocator;
if (!SUCCEEDED(device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&commandAllocator)))) {
return 0;
}
ID3D12GraphicsCommandList* commandList;
if (!SUCCEEDED(device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAllocator, nullptr, IID_PPV_ARGS(&commandList)))) {
return 0;
}
ID3D12Fence* fence;
if (!SUCCEEDED(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)))) {
return 0;
}
HANDLE fenceEvent = CreateEventEx(nullptr, false, false, EVENT_ALL_ACCESS);
if (!fenceEvent) {
return 0;
}
DirectXOffscreenDevice *d3dDevice = new DirectXOffscreenDevice();
d3dDevice->commandAllocator = commandAllocator;
d3dDevice->commandList = commandList;
d3dDevice->fence = fence;
d3dDevice->fenceEvent = fenceEvent;
d3dDevice->backendContext.fAdapter = adapter;
d3dDevice->backendContext.fDevice = device;
d3dDevice->backendContext.fQueue = queue;
d3dDevice->backendContext.fProtectedContext = GrProtected::kNo;
return toJavaPointer(d3dDevice);
}