コード例 #1
0
        public static ulong UpdateSubresources(
            ID3D12GraphicsCommandList pCmdList,
            ID3D12Resource pDestinationResource,
            ID3D12Resource pIntermediate,
            int FirstSubresource,
            int NumSubresources,
            ulong RequiredSize,
            Span <PlacedSubresourceFootPrint> pLayouts,
            Span <int> pNumRows,
            Span <ulong> pRowSizesInBytes,
            Span <SubresourceData> pSrcData)
        {
            var IntermediateDesc = pIntermediate.Description;
            var DestinationDesc  = pDestinationResource.Description;

            if (IntermediateDesc.Dimension != ResourceDimension.Buffer ||
                IntermediateDesc.Width < RequiredSize + pLayouts[0].Offset ||
                (DestinationDesc.Dimension == ResourceDimension.Buffer &&
                 (FirstSubresource != 0 || NumSubresources != 1)))
            {
                return(0);
            }

            int sum = 0;

            for (int i = pRowSizesInBytes.Length - 1; i < pRowSizesInBytes.Length; i++)
            {
                sum = Math.Max((int)pLayouts[i].Offset + pLayouts[i].Footprint.RowPitch * pNumRows[i] * pLayouts[i].Footprint.Depth, sum);
            }

            Span <byte> pData = pIntermediate.Map <byte>(0, sum);

            for (int i = 0; i < NumSubresources; ++i)
            {
                MemcpySubresource((ulong)pLayouts[i].Footprint.RowPitch, (uint)pLayouts[i].Footprint.RowPitch * (uint)pNumRows[i],
                                  pData.Slice((int)pLayouts[i].Offset), pSrcData[i], (int)pRowSizesInBytes[i], pNumRows[i], pLayouts[i].Footprint.Depth);
            }
            pIntermediate.Unmap(0, null);

            if (DestinationDesc.Dimension == ResourceDimension.Buffer)
            {
                pCmdList.CopyBufferRegion(
                    pDestinationResource, 0, pIntermediate, pLayouts[0].Offset, (ulong)pLayouts[0].Footprint.Width);
            }
            else
            {
                for (int i = 0; i < NumSubresources; ++i)
                {
                    TextureCopyLocation Dst = new TextureCopyLocation(pDestinationResource, i + FirstSubresource);
                    TextureCopyLocation Src = new TextureCopyLocation(pIntermediate, pLayouts[i]);
                    pCmdList.CopyTextureRegion(Dst, 0, 0, 0, Src, null);
                }
            }
            return(RequiredSize);
        }