Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Om du vill läsa tillbaka data från GPU:n (till exempel för att ta en skärmdump) använder du en heap för återläsning. Den här tekniken är relaterad till Ladda upp texturdata via en buffert, med några skillnader.
- Om du vill läsa tillbaka data skapar du en heap med D3D12_HEAP_TYPE inställd på D3D12_HEAP_TYPE_READBACKi stället för D3D12_HEAP_TYPE_UPLOAD.
- Resursen på läs-tillbaka-heapen måste alltid vara en D3D12_RESOURCE_DIMENSION_BUFFER.
- Du använder ett staket för att identifiera när GPU:n slutför bearbetningen av en ram (när den är klar med att skriva data till utdatabufferten). Detta är viktigt eftersom metoden ID3D12Resource::Map inte synkroniseras med GPU:n (omvänt synkroniserar direct3D 11-motsvarigheten ). Direct3D 12 Map-anrop fungerar som om du kallade Direct3D 11-motsvarigheten med flaggan NO_OVERWRITE.
- När data är klara (inklusive eventuella nödvändiga resursbarriärer) anropar du ID3D12Resource::Map för att göra återläsningsdata synliga för processorn.
Kodexempel
Kodexemplet nedan visar den allmänna konturen av processen för att läsa tillbaka data från GPU:n till processorn via en buffert.
// The output buffer (created below) is on a default heap, so only the GPU can access it.
D3D12_HEAP_PROPERTIES defaultHeapProperties{ CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT) };
D3D12_RESOURCE_DESC outputBufferDesc{ CD3DX12_RESOURCE_DESC::Buffer(outputBufferSize, D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) };
winrt::com_ptr<::ID3D12Resource> outputBuffer;
winrt::check_hresult(d3d12Device->CreateCommittedResource(
&defaultHeapProperties,
D3D12_HEAP_FLAG_NONE,
&outputBufferDesc,
D3D12_RESOURCE_STATE_COPY_DEST,
nullptr,
__uuidof(outputBuffer),
outputBuffer.put_void()));
// The readback buffer (created below) is on a readback heap, so that the CPU can access it.
D3D12_HEAP_PROPERTIES readbackHeapProperties{ CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_READBACK) };
D3D12_RESOURCE_DESC readbackBufferDesc{ CD3DX12_RESOURCE_DESC::Buffer(outputBufferSize) };
winrt::com_ptr<::ID3D12Resource> readbackBuffer;
winrt::check_hresult(d3d12Device->CreateCommittedResource(
&readbackHeapProperties,
D3D12_HEAP_FLAG_NONE,
&readbackBufferDesc,
D3D12_RESOURCE_STATE_COPY_DEST,
nullptr,
__uuidof(readbackBuffer),
readbackBuffer.put_void()));
{
D3D12_RESOURCE_BARRIER outputBufferResourceBarrier
{
CD3DX12_RESOURCE_BARRIER::Transition(
outputBuffer.get(),
D3D12_RESOURCE_STATE_COPY_DEST,
D3D12_RESOURCE_STATE_COPY_SOURCE)
};
commandList->ResourceBarrier(1, &outputBufferResourceBarrier);
}
commandList->CopyResource(readbackBuffer.get(), outputBuffer.get());
// Code goes here to close, execute (and optionally reset) the command list, and also
// to use a fence to wait for the command queue.
// The code below assumes that the GPU wrote FLOATs to the buffer.
D3D12_RANGE readbackBufferRange{ 0, outputBufferSize };
FLOAT * pReadbackBufferData{};
winrt::check_hresult(
readbackBuffer->Map
(
0,
&readbackBufferRange,
reinterpret_cast<void**>(&pReadbackBufferData)
)
);
// Code goes here to access the data via pReadbackBufferData.
D3D12_RANGE emptyRange{ 0, 0 };
readbackBuffer->Unmap
(
0,
&emptyRange
);
En fullständig implementering av en skärmbildsrutin som läser återgivningens målstruktur och skriver den till disken som en fil finns i DirectX Tool Kit for DX12's ScreenGrab.