D3D12: Fix Quad test screenshot and update texture

- Fix SetGraphicsRootDescriptorTable call order (SetRootSignature before SetPipelineState)
- Rename texture earth_d.jpg -> earth.png
- Fix vertex order for TriangleStrip quad rendering
- Add integration test README
- Add debug logging to D3D12Screenshot
- Remove obsolete run.bat
This commit is contained in:
2026-03-21 15:54:15 +08:00
parent c563db3123
commit a6c6482125
7 changed files with 66 additions and 21 deletions

View File

@@ -4,6 +4,7 @@
#include "RHI/D3D12/D3D12Texture.h"
#include "Debug/Logger.h"
#include <d3d12.h>
#include <dxgi.h>
#include <stdio.h>
namespace XCEngine {
@@ -65,6 +66,13 @@ bool D3D12Screenshot::CopyToReadbackAndSave(ID3D12Device* device,
ID3D12CommandAllocator* cmdAlloc = nullptr;
HRESULT hr = device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&cmdAlloc));
if (FAILED(hr)) {
XCEngine::Debug::Logger::Get().Error(XCEngine::Debug::LogCategory::Rendering, "Screenshot: CreateCommandAllocator failed");
if (hr == DXGI_ERROR_DEVICE_REMOVED) {
HRESULT removedReason = device->GetDeviceRemovedReason();
char reasonMsg[256];
sprintf_s(reasonMsg, sizeof(reasonMsg), "Screenshot: Device removed reason: 0x%X", removedReason);
XCEngine::Debug::Logger::Get().Error(XCEngine::Debug::LogCategory::Rendering, reasonMsg);
}
return false;
}
@@ -93,6 +101,7 @@ bool D3D12Screenshot::CopyToReadbackAndSave(ID3D12Device* device,
IID_PPV_ARGS(&readbackBuffer));
if (FAILED(hr)) {
XCEngine::Debug::Logger::Get().Error(XCEngine::Debug::LogCategory::Rendering, "Screenshot: CreateCommittedResource failed");
cmdAlloc->Release();
return false;
}
@@ -100,6 +109,7 @@ bool D3D12Screenshot::CopyToReadbackAndSave(ID3D12Device* device,
ID3D12GraphicsCommandList* cmdList = nullptr;
hr = device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdAlloc, nullptr, IID_PPV_ARGS(&cmdList));
if (FAILED(hr)) {
XCEngine::Debug::Logger::Get().Error(XCEngine::Debug::LogCategory::Rendering, "Screenshot: CreateCommandList failed");
cmdAlloc->Release();
readbackBuffer->Release();
return false;
@@ -140,11 +150,21 @@ bool D3D12Screenshot::CopyToReadbackAndSave(ID3D12Device* device,
cmdList->Close();
ID3D12CommandList* ppCmdLists[] = { cmdList };
commandQueue->ExecuteCommandLists(1, ppCmdLists);
XCEngine::Debug::Logger::Get().Info(XCEngine::Debug::LogCategory::Rendering, "Screenshot: ExecuteCommandLists done, waiting for fence...");
HANDLE fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
ID3D12Fence* fence = nullptr;
hr = device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence));
if (SUCCEEDED(hr)) {
if (FAILED(hr)) {
XCEngine::Debug::Logger::Get().Error(XCEngine::Debug::LogCategory::Rendering, "Screenshot: CreateFence failed");
cmdList->Release();
cmdAlloc->Release();
readbackBuffer->Release();
CloseHandle(fenceEvent);
return false;
}
XCEngine::Debug::Logger::Get().Info(XCEngine::Debug::LogCategory::Rendering, "Screenshot: Fence created, waiting...");
{
UINT64 fenceValue = 1;
commandQueue->Signal(fence, fenceValue);
if (fence->GetCompletedValue() < fenceValue) {