Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Возвращает указатель ЦП на указанный подресурс в ресурсе, но не может раскрывать значение указателя приложениям. Сопоставление также делает кэш ЦП недействительным при необходимости, чтобы ЦП считывал этот адрес в соответствии с любыми изменениями, сделанными GPU.
Синтаксис
HRESULT Map(
UINT Subresource,
[in, optional] const D3D12_RANGE *pReadRange,
[out, optional] void **ppData
);
Параметры
Subresource
Тип: UINT
Указывает номер индекса подресурса.
[in, optional] pReadRange
Тип: const D3D12_RANGE*
Указатель на D3D12_RANGE структуру, описывающую диапазон памяти для доступа.
Это означает, что регион, считывающий ЦП, и координаты являются относительными по подресурсам. Указатель null указывает, что весь подресурс может считываться ЦП. Допустимо указать, что ЦП не будет считывать данные, передав диапазон, в котором end меньше или равно Begin.
[out, optional] ppData
Тип: void**
Указатель на блок памяти, который получает указатель на данные ресурса.
Допустимый указатель null и полезен для кэширования диапазона виртуальных адресов ЦП для таких методов, как WriteToSubresource. Если значение ppData не равно NULL, возвращаемый указатель никогда не смещается любыми значениями в pReadRange.
Возвращаемое значение
Тип: HRESULT
Этот метод возвращает один из кодов возврата Direct3D 12.
Замечания
Сопоставление и unmap можно безопасно вызывать несколькими потоками. Вызовы вложенных карт поддерживаются и учитываются по ссылке. Первый вызов map выделяет диапазон виртуальных адресов ЦП для ресурса. Последний вызов unmap освобождает диапазон виртуальных адресов центрального процессора. Виртуальный адрес ЦП обычно возвращается в приложение; но управление содержимым текстур с неизвестными макетами исключает раскрытие виртуального адреса ЦП. Дополнительные сведения см. в статье WriteToSubresource . Приложения не могут полагаться на согласованный адрес, если карта постоянно не вложена.
Указатели, возвращаемые картой , не гарантируют все возможности обычных указателей, но большинство приложений не замечают разницу в обычном использовании. Например, указатели с поведением WRITE_COMBINE имеют более слабые гарантии упорядочивания памяти ЦП, чем WRITE_BACK поведение. Память, доступная как ЦП, так и GPU, не гарантирует общий доступ к одной и той же атомарной памяти, что и ЦП, из-за ограничений PCIe. Используйте заборы для синхронизации.
Существует две категории модели использования для карт, простых и расширенных. Простые модели использования позволяют максимально повысить производительность инструментов, поэтому приложения рекомендуется придерживаться простых моделей до тех пор, пока не будут проверены расширенные модели, необходимые приложению.
Простые модели использования
Приложения должны придерживаться абстракций типа кучи ДЛЯ ЗАГРУЗКИ, DEFAULT и READBACK, чтобы обеспечить поддержку всех архитектур адаптеров достаточно хорошо.Приложения должны избегать операций чтения ЦП из указателей на ресурсы в кучах UPLOAD, даже случайно. Операции чтения ЦП будут работать, но запрещено медленно работают во многих распространенных архитектурах GPU, поэтому рассмотрим следующее:
- Не считывайте ЦП из ресурсов, связанных с кучами, которые D3D12_HEAP_TYPE_UPLOAD или имеют D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE.
- Область памяти, в которую можно выделить точки pData с PAGE_WRITECOMBINE, и приложение должно соблюдать все ограничения, связанные с такой памятью.
-
Даже следующий код C++ может считывать из памяти и запускать штраф производительности, так как код может расшириться до следующего кода сборки x86.
Код C++:
*((int*)MappedResource.pData) = 0;Код сборки x86:
AND DWORD PTR [EAX],0 - Используйте соответствующие параметры оптимизации и конструкции языка, чтобы избежать этой штрафной производительности. Например, можно избежать оптимизации xor с помощью переменной указателя или оптимизации скорости кода вместо размера кода.
Расширенные модели использования
Ресурсы на кучах, доступных для ЦП, можно постоянно сопоставлять, что означает, что карта может вызываться один раз после создания ресурса. Не нужно вызывать изображение, но адрес, возвращаемый из карты , больше не должен использоваться после освобождения последней ссылки на ресурс. При использовании постоянной карты приложение должно убедиться, что ЦП завершает запись данных в память, прежде чем GPU выполнит список команд, который считывает или записывает память. В распространенных сценариях приложение просто должно записывать в память перед вызовом ExecuteCommandLists; но использование забора для задержки выполнения списка команд также работает.Все типы памяти, доступные для ЦП, поддерживают постоянное сопоставление, где ресурс сопоставляется, но затем никогда не не сопоставляется, если приложение не обращается к указателю после удаления ресурса.
Примеры
В примере D3D12Bundles используется ID3D12Resource::Map следующим образом:
Скопируйте данные треугольника в буфер вершин.
// Copy the triangle data to the vertex buffer.
UINT8* pVertexDataBegin;
CD3DX12_RANGE readRange(0, 0); // We do not intend to read from this resource on the CPU.
ThrowIfFailed(m_vertexBuffer->Map(0, &readRange, reinterpret_cast<void**>(&pVertexDataBegin)));
memcpy(pVertexDataBegin, triangleVertices, sizeof(triangleVertices));
m_vertexBuffer->Unmap(0, nullptr);
Создайте кучу отправки для буферов констант.
// Create an upload heap for the constant buffers.
ThrowIfFailed(pDevice->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(ConstantBuffer) * m_cityRowCount * m_cityColumnCount),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&m_cbvUploadHeap)));
// Map the constant buffers. Note that unlike D3D11, the resource
// does not need to be unmapped for use by the GPU. In this sample,
// the resource stays 'permanently' mapped to avoid overhead with
// mapping/unmapping each frame.
CD3DX12_RANGE readRange(0, 0); // We do not intend to read from this resource on the CPU.
ThrowIfFailed(m_cbvUploadHeap->Map(0, &readRange, reinterpret_cast<void**>(&m_pConstantBuffers)));
См. пример кода в справочнике D3D12.
Требования
| Требование | Ценность |
|---|---|
| целевая платформа | Виндоус |
| Header | d3d12.h |
| Library | D3D12.lib |
| DLL | D3D12.dll |