Commit d66910d3 authored by Roman Sedaikin's avatar Roman Sedaikin

Falling back to software rendering if Windows OS does not support DirectX 12.

parent fbe6b0bf
...@@ -185,21 +185,21 @@ HRESULT CreateDXGIFactory2( ...@@ -185,21 +185,21 @@ HRESULT CreateDXGIFactory2(
} }
JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_createDevice( JNIEXPORT jlong JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_createDevice(
JNIEnv *env, jobject redrawer) JNIEnv *env, jobject redrawer, jlong windowHandle)
{ {
DirectXDevice *d3dDevice = new DirectXDevice(); DirectXDevice *d3dDevice = new DirectXDevice();
gr_cp<IDXGIFactory4> factory; gr_cp<IDXGIFactory4> deviceFactory;
if (!SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(&factory)))) if (!SUCCEEDED(CreateDXGIFactory1(IID_PPV_ARGS(&deviceFactory))))
{ {
return false; return 0;
} }
gr_cp<IDXGIAdapter1> hardwareAdapter; gr_cp<IDXGIAdapter1> hardwareAdapter;
defineHardwareAdapter(factory.get(), &hardwareAdapter); defineHardwareAdapter(deviceFactory.get(), &hardwareAdapter);
gr_cp<ID3D12Device> device; gr_cp<ID3D12Device> device;
if (!SUCCEEDED(D3D12CreateDevice(hardwareAdapter.get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device)))) if (!SUCCEEDED(D3D12CreateDevice(hardwareAdapter.get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&device))))
{ {
return false; return 0;
} }
// Create the command queue // Create the command queue
...@@ -210,7 +210,7 @@ HRESULT CreateDXGIFactory2( ...@@ -210,7 +210,7 @@ HRESULT CreateDXGIFactory2(
if (!SUCCEEDED(device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&queue)))) if (!SUCCEEDED(device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&queue))))
{ {
return false; return 0;
} }
d3dDevice->backendContext.fAdapter = hardwareAdapter; d3dDevice->backendContext.fAdapter = hardwareAdapter;
...@@ -220,19 +220,11 @@ HRESULT CreateDXGIFactory2( ...@@ -220,19 +220,11 @@ HRESULT CreateDXGIFactory2(
d3dDevice->device = device; d3dDevice->device = device;
d3dDevice->queue = queue; d3dDevice->queue = queue;
return toJavaPointer(d3dDevice);
}
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_createSwapChain(
JNIEnv *env, jobject redrawer, jlong windowHandle, jlong devicePtr)
{
DirectXDevice *d3dDevice = fromJavaPointer<DirectXDevice*>(devicePtr);
// Make the swapchain // Make the swapchain
HWND fWindow = (HWND)windowHandle; HWND fWindow = (HWND)windowHandle;
gr_cp<IDXGIFactory4> factory; gr_cp<IDXGIFactory4> swapChainFactory;
GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory))); GR_D3D_CALL_ERRCHECK(CreateDXGIFactory2(0, IID_PPV_ARGS(&swapChainFactory)));
DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {};
swapChainDesc.BufferCount = BuffersCount; swapChainDesc.BufferCount = BuffersCount;
...@@ -245,10 +237,12 @@ HRESULT CreateDXGIFactory2( ...@@ -245,10 +237,12 @@ HRESULT CreateDXGIFactory2(
swapChainFSDesc.Windowed = TRUE; swapChainFSDesc.Windowed = TRUE;
gr_cp<IDXGISwapChain1> swapChain; gr_cp<IDXGISwapChain1> swapChain;
GR_D3D_CALL_ERRCHECK(factory->CreateSwapChainForHwnd(d3dDevice->queue.get(), fWindow, &swapChainDesc, &swapChainFSDesc, nullptr, &swapChain)); GR_D3D_CALL_ERRCHECK(swapChainFactory->CreateSwapChainForHwnd(d3dDevice->queue.get(), fWindow, &swapChainDesc, &swapChainFSDesc, nullptr, &swapChain));
GR_D3D_CALL_ERRCHECK(swapChain->QueryInterface(IID_PPV_ARGS(&d3dDevice->swapChain))); GR_D3D_CALL_ERRCHECK(swapChain->QueryInterface(IID_PPV_ARGS(&d3dDevice->swapChain)));
GR_D3D_CALL_ERRCHECK(d3dDevice->device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3dDevice->fence))); GR_D3D_CALL_ERRCHECK(d3dDevice->device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3dDevice->fence)));
d3dDevice->fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); d3dDevice->fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
return toJavaPointer(d3dDevice);
} }
JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_resizeBuffers( JNIEXPORT void JNICALL Java_org_jetbrains_skiko_redrawer_Direct3DRedrawer_resizeBuffers(
......
...@@ -20,8 +20,8 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer) ...@@ -20,8 +20,8 @@ internal class Direct3DContextHandler(layer: SkiaLayer) : ContextHandler(layer)
override fun initContext(): Boolean { override fun initContext(): Boolean {
try { try {
if (context == null) { if (context == null) {
device = directXRedrawer.createDevice() device = directXRedrawer.createDevice(layer.windowHandle)
directXRedrawer.createSwapChain(layer.windowHandle, device) if (device == 0L) return false
context = directXRedrawer.makeContext(device) context = directXRedrawer.makeContext(device)
} }
} catch (e: Exception) { } catch (e: Exception) {
......
...@@ -37,10 +37,9 @@ internal class Direct3DRedrawer( ...@@ -37,10 +37,9 @@ internal class Direct3DRedrawer(
makeDirectXRenderTarget(device, width, height) makeDirectXRenderTarget(device, width, height)
) )
external fun createDevice(): Long external fun createDevice(windowHandle: Long): Long
external fun makeDirectXContext(device: Long): Long external fun makeDirectXContext(device: Long): Long
external fun makeDirectXRenderTarget(device: Long, width: Int, height: Int): Long external fun makeDirectXRenderTarget(device: Long, width: Int, height: Int): Long
external fun createSwapChain(windowHandle: Long, device: Long)
external fun resizeBuffers(device: Long, width: Int, height: Int) external fun resizeBuffers(device: Long, width: Int, height: Int)
external fun finishFrame(device: Long, context: Long, surface: Long) external fun finishFrame(device: Long, context: Long, surface: Long)
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment