internal GraphicsRenderTarget(GraphicsSwapchain swapchain, int index) : base(swapchain)
    {
        _index = index;

        _d3d12RtvDescriptorHandle = GetD3D12RtvDescriptorHandle();

        var d3d12RtvResource = CreateD3D12RtvResource(out _d3d12RtvResourceVersion);

        _d3d12RtvResource.Attach(d3d12RtvResource);

        ID3D12Resource *CreateD3D12RtvResource(out uint d3d12RtvResourceVersion)
        {
            var d3d12RenderTargetViewDesc = new D3D12_RENDER_TARGET_VIEW_DESC {
                Format        = swapchain.RenderTargetFormat.AsDxgiFormat(),
                ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D,
                Texture2D     = new D3D12_TEX2D_RTV()
            };

            ID3D12Resource *d3d12RtvResource;

            ThrowExternalExceptionIfFailed(swapchain.DxgiSwapchain->GetBuffer((uint)_index, __uuidof <ID3D12Resource>(), (void **)&d3d12RtvResource));

            swapchain.Device.D3D12Device->CreateRenderTargetView(d3d12RtvResource, &d3d12RenderTargetViewDesc, _d3d12RtvDescriptorHandle);
            return(GetLatestD3D12Resource(d3d12RtvResource, out d3d12RtvResourceVersion));
        }

        D3D12_CPU_DESCRIPTOR_HANDLE GetD3D12RtvDescriptorHandle()
        {
            var d3d12RtvDescriptorHandleIncrementSize = Device.D3D12RtvDescriptorSize;
            var d3d12RtvDescriptorHandleForHeapStart  = Swapchain.D3D12RtvDescriptorHeap->GetCPUDescriptorHandleForHeapStart();

            D3D12_CPU_DESCRIPTOR_HANDLE.InitOffsetted(out var d3d12RtvDescriptorHandle, d3d12RtvDescriptorHandleForHeapStart, _index, d3d12RtvDescriptorHandleIncrementSize);
            return(d3d12RtvDescriptorHandle);
        }
    }
Esempio n. 2
0
        private ID3D12Resource *[] CreateRenderTargets()
        {
            var renderTargets = new ID3D12Resource *[_graphicsSurface.BufferCount];
            var iid           = IID_ID3D12Resource;

            var renderTargetDescriptorSize = Device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
            var renderTargetHandle         = RenderTargetsHeap->GetCPUDescriptorHandleForHeapStart();

            var renderTargetViewDesc = new D3D12_RENDER_TARGET_VIEW_DESC {
                Format        = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
                ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D,
                Anonymous     = new D3D12_RENDER_TARGET_VIEW_DESC._Anonymous_e__Union {
                    Texture2D = new D3D12_TEX2D_RTV {
                        MipSlice   = 0,
                        PlaneSlice = 0,
                    },
                },
            };

            for (var i = 0; i < renderTargets.Length; i++)
            {
                ID3D12Resource *renderTarget;
                ThrowExternalExceptionIfFailed(nameof(IDXGISwapChain.GetBuffer), SwapChain->GetBuffer((uint)i, &iid, (void **)&renderTarget));
                renderTargets[i] = renderTarget;

                Device->CreateRenderTargetView(renderTarget, &renderTargetViewDesc, renderTargetHandle);
                _ = renderTargetHandle.Offset((int)renderTargetDescriptorSize);
            }

            return(renderTargets);
        }
Esempio n. 3
0
        private D3D12_CPU_DESCRIPTOR_HANDLE CreateD3D12RenderTargetDescriptor()
        {
            _state.ThrowIfDisposedOrDisposing();

            D3D12_CPU_DESCRIPTOR_HANDLE renderTargetViewHandle;

            var graphicsDevice = D3D12GraphicsDevice;
            var d3d12Device    = graphicsDevice.D3D12Device;

            var renderTargetViewDesc = new D3D12_RENDER_TARGET_VIEW_DESC {
                Format        = graphicsDevice.DxgiSwapChainFormat,
                ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D,
                Anonymous     = new D3D12_RENDER_TARGET_VIEW_DESC._Anonymous_e__Union {
                    Texture2D = new D3D12_TEX2D_RTV(),
                },
            };

            var renderTargetDescriptorIncrementSize = d3d12Device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);

            renderTargetViewHandle = graphicsDevice.D3D12RenderTargetDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
            _ = renderTargetViewHandle.Offset(Index, renderTargetDescriptorIncrementSize);

            d3d12Device->CreateRenderTargetView(D3D12RenderTargetResource, &renderTargetViewDesc, renderTargetViewHandle);

            return(renderTargetViewHandle);
        }
Esempio n. 4
0
        public virtual void CreateRenderTargetView(
            ID3D12Resource pResource,
            ref D3D12_RENDER_TARGET_VIEW_DESC pDesc,
            D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor
            )
        {
            var fp = GetFunctionPointer(20);

            if (m_CreateRenderTargetViewFunc == null)
            {
                m_CreateRenderTargetViewFunc = (CreateRenderTargetViewFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(CreateRenderTargetViewFunc));
            }

            m_CreateRenderTargetViewFunc(m_ptr, pResource != null ? pResource.Ptr : IntPtr.Zero, ref pDesc, DestDescriptor);
        }