mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-28 18:45:54 -05:00
D3D12: Texture read-back.
This commit is contained in:
parent
9429d46f1c
commit
47aeaf49a9
1 changed files with 57 additions and 1 deletions
|
@ -884,6 +884,7 @@ namespace bgfx { namespace d3d12
|
|||
| (m_options.ROVsSupported ? BGFX_CAPS_FRAGMENT_ORDERING : 0)
|
||||
// | BGFX_CAPS_SWAP_CHAIN
|
||||
| BGFX_CAPS_TEXTURE_BLIT
|
||||
| BGFX_CAPS_TEXTURE_READ_BACK
|
||||
);
|
||||
g_caps.maxTextureSize = 16384;
|
||||
g_caps.maxFBAttachments = uint8_t(bx::uint32_min(16, BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) );
|
||||
|
@ -1273,8 +1274,63 @@ namespace bgfx { namespace d3d12
|
|||
{
|
||||
}
|
||||
|
||||
void readTexture(TextureHandle /*_handle*/, void* /*_data*/) BX_OVERRIDE
|
||||
void readTexture(TextureHandle _handle, void* _data) BX_OVERRIDE
|
||||
{
|
||||
const TextureD3D12& texture = m_textures[_handle.idx];
|
||||
|
||||
D3D12_RESOURCE_DESC desc = texture.m_ptr->GetDesc();
|
||||
|
||||
D3D12_PLACED_SUBRESOURCE_FOOTPRINT layout;
|
||||
uint32_t numRows;
|
||||
uint64_t total;
|
||||
uint64_t srcPitch;
|
||||
m_device->GetCopyableFootprints(&desc
|
||||
, 0
|
||||
, 1
|
||||
, 0
|
||||
, &layout
|
||||
, &numRows
|
||||
, &srcPitch
|
||||
, &total
|
||||
);
|
||||
|
||||
ID3D12Resource* readback = createCommittedResource(m_device, HeapProperty::ReadBack, total);
|
||||
|
||||
D3D12_BOX box;
|
||||
box.left = 0;
|
||||
box.top = 0;
|
||||
box.right = texture.m_width;
|
||||
box.bottom = texture.m_height;
|
||||
box.front = 0;
|
||||
box.back = 1;
|
||||
|
||||
D3D12_TEXTURE_COPY_LOCATION dstLocation = { readback, D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT, { layout } };
|
||||
D3D12_TEXTURE_COPY_LOCATION srcLocation = { texture.m_ptr, D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX, {} };
|
||||
m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, &box);
|
||||
|
||||
finish();
|
||||
m_commandList = m_cmd.alloc();
|
||||
|
||||
uint8_t* src;
|
||||
readback->Map(0, NULL, (void**)&src);
|
||||
|
||||
const uint8_t bpp = getBitsPerPixel(TextureFormat::Enum(texture.m_textureFormat) );
|
||||
uint8_t* dst = (uint8_t*)_data;
|
||||
uint32_t dstPitch = texture.m_width*bpp/8;
|
||||
|
||||
uint32_t pitch = bx::uint32_min(uint32_t(srcPitch), dstPitch);
|
||||
|
||||
for (uint32_t yy = 0, height = texture.m_height; yy < height; ++yy)
|
||||
{
|
||||
memcpy(dst, src, pitch);
|
||||
|
||||
src += srcPitch;
|
||||
dst += dstPitch;
|
||||
}
|
||||
|
||||
readback->Unmap(0, NULL);
|
||||
|
||||
DX_RELEASE(readback, 0);
|
||||
}
|
||||
|
||||
void resizeTexture(TextureHandle _handle, uint16_t _width, uint16_t _height) BX_OVERRIDE
|
||||
|
|
Loading…
Reference in a new issue