Что делает ID3D11Device :: CreateBuffer под капотом? - PullRequest
1 голос
/ 05 февраля 2020

Я знаю, что эта функция создает " буфер ." Но что именно является буфером? Это COM-объект в памяти? Если это так, то, в моем понимании, эта функция принимает дескриптор и некоторые исходные данные для создания этого COM-объекта в памяти, а затем устанавливает указатель ID3D11Buffer, указанный входным ID3D11Buffer **, на интерфейс в недавно созданный объект COM. После создания COM-объекта инициализирующие данные больше не нужны, и мы можем их удалить. И как только мы вызовем ID3DBuffer :: Release (), подчеркнутый COM-объект будет уничтожен. Правильно ли мое понимание?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

CreateBuffer возвращает объект интерфейса COM ID3D11Buffer*. Пока он имеет ненулевой счетчик ссылок (он начинается с 1; каждый вызов AddRef добавляет 1, каждый вызов Release вычитает 1), тогда любые ресурсы, которыми он управляет, активны.

Как От того, где именно выделяются ресурсы, это действительно зависит. Вы можете найти эту статью интересной, поскольку она охватывает различные способы распределения ресурсов Direct3D.

ОБНОВЛЕНИЕ: Вам также следует прочитать это Документы Microsoft введение в подмножество COM, используемое DirectX.

1 голос
/ 05 февраля 2020

В общем случае буфер - это непрерывная, управляемая область памяти.

Память - это большой набор адресов элементов для чтения / записи (конечно, один элемент на адрес), скажем, 2 30 адреса элементов 8-битной памяти составляют 1 ГБ памяти.

Если существует только одна программа, и она использует эти адреса статически (например, адреса от 0x1000 до 0x2000 используются для хранения списка элементов), тогда память не должна управляться, и в этом контексте буфер это просто непрерывный диапазон адресов.

Однако, если есть несколько программ или использование памяти программ является динамическим c (например, это зависит от того, сколько элементов было запрошено для чтения из ввода), тогда память должна управляться.
Вы должны отслеживать, какие диапазоны уже используются, а какие нет. Таким образом, буфер становится непрерывным диапазоном адресов с их атрибутами (например, используется ли он или нет).
Атрибуты буфера могут сильно различаться между различными распределителями памяти, в общем, мы скажем, что буфер управляется , потому что мы позволяем распределителю памяти обрабатывать его: найдите подходящий свободный диапазон, отметьте его как использованный, скажите, может ли он переместить буфер назад, отметьте его свободным, когда он будет завершен.


Это верно для каждой совместно используемой памяти, поэтому, безусловно, это верно для основной памяти (RAM) и графической памяти c.
Это память внутри графической c карта, доступ к которой осуществляется точно так же, как и в основной памяти (с точки зрения ЦП).

Что возвращает CreateBuffer - это COM-объект в основной памяти, который содержит метаданные, необходимые для простой обработки буфера
Он не содержит самого буфера, потому что этот COM-объект всегда находится в памяти, в то время как буфера обычно нет (он находится в графической c памяти).

CreateBuffer запрашивает драйвер graphi c для поиска подходящего диапазона свободных адресов в запрашиваемой памяти и заполнение некоторых метаданных .
Прежде чем процессор сможет получить доступ к основной памяти, необходимо настроить некоторые метаданные таблицы (таблицы страниц) как часть его механизма защиты.
Это также верно, если ЦПУ необходим доступ к памяти graphi c (возможно, с несколькими дополнительными шагами, для управления MMIO при необходимости).
В графическом процессоре также есть таблицы страниц, поэтому, если к графическому процессору требуется доступ к основной памяти, эти таблицы страниц также должны быть созданы.

Вы видите, что важно знать, как будет использоваться буфер.
Еще одна вещь, которую следует учитывать, - это то, что графические процессоры используют высокооптимизированный формат памяти - например, буфер, используемый для поверхности, может быть изображен как прямоугольник angular область памяти.
То же самое верно для буфера, используемого текстурой.
Однако два хранятся по-разному: поверхность сохраняется линейно, каждая строка за другой, в то время как буфер текстуры плиточный (как будто он сделан из множества, скажем, 16x16 поверхностей, сохраняемых линейно одна за другой).
Это ускоряет выборку и фильтрацию.
Кроме того, для некоторых графических процессоров может потребоваться изображение текстуры с заданным значением c область памяти, буфер вершин в другом и т. д.

Поэтому важно предоставить драйверу graphi c всю информацию, которая ему необходима, чтобы сделать лучший выбор при выделении буфера.

Как только буфер найден, драйвер (или среда выполнения D3D) инициализирует буфер по запросу.
Это может быть сделано путем копирования данных или псевдонимов через таблицы страниц (если шаг допускает это) и, в конечном итоге, использует некоторую форму копирования при записи.
Однако при этом исходные данные больше не нужны (см. this ).

COM-объект, возвращаемый CreateBuffer, является удобным прокси, затем он удаляется, благодаря обычному механизму come AddRef / Release, он также просит драйвер graphi c освободить буфер.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...