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); } }
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); }
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); }
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); }