Адрес ЦП используется, когда ЦП обращается к памяти.В случае данных в D3D12_HEAP_TYPE_UPLOAD
этот адрес используется для записи данных в ресурс, потому что он находится в некой «разделяемой памяти», к которой могут обращаться как CPU, так и GPU.Адрес ЦП - это адрес виртуальной памяти, сопоставленный с правильным физическим местоположением для требуемого типа доступа.
Адрес графического процессора используется, когда графический процессор обращается к памяти, обычно, когда он используется входным ассемблером.для геометрии (VB / IB) или внутри кучи сэмплера / дескриптора текстуры.Для D3D12_HEAP_TYPE_DEFAULT
память доступна только для графического процессора, поэтому адрес процессора на самом деле отсутствует.GPU также может напрямую считывать ресурс D3D12_HEAP_TYPE_UPLOAD
.Адрес графического процессора - это виртуальный адрес, характерный для архитектуры памяти графического процессора.
Для систем с унифицированной архитектурой памяти (UMA), таких как Xbox One, адреса процессора и графического процессора часто совпадают с адресом виртуальной памяти.
Вы загружаете данные в ресурс D3D12_HEAP_TYPE_DEFAULT
, сначала копируя их в объект D3D12_HEAP_TYPE_UPLOAD
через Map
в ЦП, затем вы должны выполнить команду списка командв графическом процессоре для фактического копирования данных оттуда в ресурс D3D12_HEAP_TYPE_DEFAULT
.
В случае констант они обычно находятся в кучах D3D12_HEAP_TYPE_UPLOAD
.Хотя вы также можете использовать VB и IB в этих кучах, они действительно полезны только для ресурсов стиля «динамического использования», которые обновляются в каждом кадре.На большинстве архитектур с графическим процессором их быстрее получить в виде ресурса «статического использования» в D3D12_HEAP_TYPE_DEFAULT
.Поскольку константы обычно меняют каждый кадр, не имеет смысла помещать их в D3D12_HEAP_TYPE_DEFAULT
.
Помните, что вы, разработчик приложения, несете ответственность за синхронизацию CPU / GPU через заборы, поэтому вам необходимоубедитесь, что вы не меняете память на процессоре, пока он все еще нужен графическому процессору.За исключением очень простых случаев (как в этом примере , где он в основном создает один ресурс постоянного буфера на кадр фрейма буфера), вам обычно нужен какой-то линейный диспетчер памяти для констант.Для примера см. GraphicsMemory
в DirectX Tool Kit для DX12 .
Одна заключительная проблема состоит в том, что цель рендеринга обычно должна быть в доступной памяти GPU, которая не доступнаПроцессор из соображений производительности даже в системах UMA.В некоторых случаях графический процессор фактически работает в «тайлах», что также имеет значение для целевого буфера рендеринга.Цель кучи D3D12_HEAP_TYPE_READBACK
состоит в том, чтобы оптимизировать случай, когда вы хотите, чтобы графический процессор записывал данные из цели рендеринга один раз в место, которое ЦП может читать, но не записывать.