Replace swap chain back buffers with D3D12Texture wrapper

This commit is contained in:
2026-03-15 20:01:39 +08:00
parent 13818fe641
commit e1bbe24f0d

View File

@@ -59,7 +59,7 @@ XCEngine::RHI::D3D12CommandQueue gCommandQueue;
XCEngine::RHI::D3D12SwapChain gSwapChain;
// 渲染目标 (SwapChain的后台Buffer)
ID3D12Resource* gColorRTs[2]; // 颜色缓冲 (双缓冲)
XCEngine::RHI::D3D12Texture gColorRTs[2]; // 颜色缓冲 (双缓冲)
int gCurrentRTIndex = 0;
// 描述符堆
@@ -438,10 +438,10 @@ bool InitD3D12(HWND inHWND, int inWidth, int inHeight) {
for (int i = 0; i < 2; i++) {
ID3D12Resource* buffer = nullptr;
gSwapChain.GetSwapChain()->GetBuffer(i, IID_PPV_ARGS(&buffer));
gColorRTs[i] = buffer;
gColorRTs[i].InitializeFromExisting(buffer);
D3D12_CPU_DESCRIPTOR_HANDLE rtvPointer;
rtvPointer.ptr = rtvHeapStart.ptr + i * gRTVDescriptorSize;
gSwapChainRTVs[i].InitializeAt(device, gColorRTs[i], rtvPointer, nullptr);
gSwapChainRTVs[i].InitializeAt(device, gColorRTs[i].GetResource(), rtvPointer, nullptr);
}
D3D12_DEPTH_STENCIL_VIEW_DESC d3dDSViewDesc = {};
d3dDSViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
@@ -493,7 +493,7 @@ void EndCommandList() {
//=================================================================================
void BeginRenderToSwapChain(ID3D12GraphicsCommandList* inCommandList) {
gCurrentRTIndex = gSwapChain.GetCurrentBackBufferIndex();
D3D12_RESOURCE_BARRIER barrier = InitResourceBarrier(gColorRTs[gCurrentRTIndex], D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
D3D12_RESOURCE_BARRIER barrier = InitResourceBarrier(gColorRTs[gCurrentRTIndex].GetResource(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
inCommandList->ResourceBarrier(1, &barrier);
D3D12_CPU_DESCRIPTOR_HANDLE colorRT, dsv;
dsv.ptr = gSwapChainDSVHeap.GetCPUDescriptorHandleForHeapStart().ptr;
@@ -513,7 +513,7 @@ void BeginRenderToSwapChain(ID3D12GraphicsCommandList* inCommandList) {
// 状态转换: RENDER_TARGET → PRESENT
//=================================================================================
void EndRenderToSwapChain(ID3D12GraphicsCommandList* inCommandList) {
D3D12_RESOURCE_BARRIER barrier = InitResourceBarrier(gColorRTs[gCurrentRTIndex], D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
D3D12_RESOURCE_BARRIER barrier = InitResourceBarrier(gColorRTs[gCurrentRTIndex].GetResource(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT);
inCommandList->ResourceBarrier(1, &barrier);
}
@@ -526,7 +526,7 @@ bool SaveScreenshot(const char* filename, int width, int height) {
ID3D12Device* device = gDevice.GetDevice();
ID3D12CommandQueue* queue = gCommandQueue.GetCommandQueue();
ID3D12Resource* renderTarget = gColorRTs[gCurrentRTIndex];
ID3D12Resource* renderTarget = gColorRTs[gCurrentRTIndex].GetResource();
Log("[DEBUG] SaveScreenshot: calling D3D12Screenshot::Capture\n");
bool result = XCEngine::RHI::D3D12Screenshot::Capture(