ID3D12Device::GetCopyableFootprints 方法 (d3d12.h)

获取可复制的资源布局。 在上传堆中子分配空间时,帮助应用填充 D3D12_PLACED_SUBRESOURCE_FOOTPRINTD3D12_SUBRESOURCE_FOOTPRINT

Syntax

void GetCopyableFootprints(
  [in]            const D3D12_RESOURCE_DESC          *pResourceDesc,
  [in]            UINT                               FirstSubresource,
  [in]            UINT                               NumSubresources,
                  UINT64                             BaseOffset,
  [out, optional] D3D12_PLACED_SUBRESOURCE_FOOTPRINT *pLayouts,
  [out, optional] UINT                               *pNumRows,
  [out, optional] UINT64                             *pRowSizeInBytes,
  [out, optional] UINT64                             *pTotalBytes
);

Parameters

[in] pResourceDesc

类型: const D3D12_RESOURCE_DESC*

资源的说明,作为指向 D3D12_RESOURCE_DESC 结构的指针。

[in] FirstSubresource

类型: UINT

资源中第一个子资源的索引。 有效值的范围为 0 到 D3D12_REQ_SUBRESOURCES。

[in] NumSubresources

类型: UINT

资源中的子资源数。 有效值的范围为 0 到 (D3D12_REQ_SUBRESOURCES - FirstSubresource)。

BaseOffset

类型: UINT64

添加到 pLayouts 数组中每个D3D12_PLACED_SUBRESOURCE_FOOTPRINT的偏移量(以字节为单位)。

[out, optional] pLayouts

类型: D3D12_PLACED_SUBRESOURCE_FOOTPRINT*

指向D3D12_PLACED_SUBRESOURCE_FOOTPRINT结构的数组(长度为 NumSubresources)的指针,用于填充每个子资源的说明和位置。

[out, optional] pNumRows

类型: UINT*

指向整数变量的数组(长度 为 NumSubresources)的指针,用于填充每个子资源的行数。

[out, optional] pRowSizeInBytes

类型: UINT64*

指向整数变量长度为 NumSubresources 的数组(长度为 NumSubresources)的指针,每个条目都用每一行的未填充大小(以字节为单位)填充每个子资源。

例如,如果 Texture2D 资源宽度为 32,并且每个像素的字节数为 4,

然后 pRowSizeInBytes 返回 128。

pRowSizeInBytes 不应与 行间距混淆,因为检查 pLayouts 并从中获取行间距会为你提供 256,因为它与D3D12_TEXTURE_DATA_PITCH_ALIGNMENT对齐。

[out, optional] pTotalBytes

类型: UINT64*

指向整数变量的指针,以字节为单位填充总大小。 如果 pResourceDesc 无效,则 pTotalBytes 的值设置为 UINT64_MAX

返回值

None

Remarks

在上传堆中子分配空间时,此例程可帮助应用程序填写 D3D12_PLACED_SUBRESOURCE_FOOTPRINTD3D12_SUBRESOURCE_FOOTPRINT 结构。 生成的结构与 GPU 适配器无关,这意味着值不会从一个 GPU 适配器更改为下一个 GPU 适配器。 GetCopyableFootprints 使用有关资源格式、纹理布局和对齐要求(从 D3D12_RESOURCE_DESC 结构)的指定详细信息来填写子资源结构。 应用程序可以访问所有这些详细信息,因此此方法或其变体可以作为应用的一部分编写。

Examples

D3D12Multithreading 示例使用 ID3D12Device::GetCopyableFootprints,如下所示:

// Returns required size of a buffer to be used for data upload
inline UINT64 GetRequiredIntermediateSize(
    _In_ ID3D12Resource* pDestinationResource,
    _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
    _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources)
{
    D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
    UINT64 RequiredSize = 0;
    
    ID3D12Device* pDevice;
    pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice));
    pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize);
    pDevice->Release();
    
    return RequiredSize;
}

请参阅 D3D12 参考 中的示例代码。

Requirements

Requirement Value
目标平台 Windows
Header d3d12.h
Library D3d12.lib
DLL D3d12.dll

另请参阅

CD3DX12_RESOURCE_DESC

CD3DX12_SUBRESOURCE_FOOTPRINT

ID3D12Device