private void CoreInitialize(
            DeviceManager manager,
            ID3D12Device *device,
            IDXGISwapChain3 *swapChain,
            GraphicalConfiguration config,
            ScreenData screenData
            )
        {
            _resourceCount = config.BufferCount;
            _resourceIndex = swapChain->GetCurrentBackBufferIndex();
            _allocator     = manager.Allocator;

            CreateRtvAndDsvResources(swapChain, config, screenData);
            CreateRtvAndDsvDescriptorHeaps(device, config);
            CreateRtvAndDsvViews(device, config);
        }
        internal static void Initialize(
            DeviceManager manager,
            ID3D12Device *device,
            IDXGISwapChain3 *swapChain,
            GraphicalConfiguration config,
            ScreenData screenData
            )
        {
            // TODO could probably use CAS/System.Threading.LazyInitializer
            lock (Lock)
            {
                Debug.Assert(!_initialized);

                _initialized = true;
                Value.CoreInitialize(manager, device, swapChain, config, screenData);
            }
        }