Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Точки разделения используются диспетчером памяти видео для разделения большого рабочего элемента, отправленного драйвером мини-порта дисплея, на небольшие рабочие элементы, для которых требуется меньше ресурсов GPU для выполнения. Например, большой буфер DMA может ссылаться на набор выделений, которые, возможно, не могут поместиться в локальной видеопамяти или в нелокальной памяти. Единственным способом обработки такого рабочего элемента является разделение на несколько небольших рабочих элементов, требующих меньше ресурсов GPU.
Примечание разделение буфера DMA и предварительная очистка буфера DMA являются разными независимыми понятиями. Драйвер минипорта дисплея всегда должен поддерживать разделение буфера DMA даже в системе с GPU, где невозможно предварительное прерывание буфера DMA. В системе с GPU, где сохранение и восстановление контекста невозможно, планировщик GPU планирует последовательное выполнение разделенных частей буфера DMA, гарантируя, что они не перемежаются с другим буфером DMA из другого контекста GPU. Однако буфер разбиения по страницам должен быть отправлен между частями разделенного буфера DMA, так как операции разбиения по страницам требуются между разделенными частями буфера DMA. Каждая точка разделения, используемая драйвером для создания потока DMA приложения, используется диспетчером памяти видео. Отправленный буфер DMA должен перепрограммировать достаточный объем состояния GPU после каждой точки разделения для учета потенциального буфера страничного обмена, который может быть вставлен в это место.
Чтобы указать точки разделения, драйвер минипорта отображения указывает значения в членах SplitOffset и SlotId структуры D3DDDI_PATCHLOCATIONLIST для каждого выделения, на которое ссылается член AllocationIndex структуры D3DDDI_PATCHLOCATIONLIST. Чтобы отслеживать использование выделения в определенном буфере DMA, менеджер видеопамяти создает массив необходимой размерности с помощью элемента MaxAllocationListSlotId структуры DXGK_DRIVERCAPS, предоставленной драйвером через вызов функции DxgkDdiQueryAdapterInfo. Этот массив инициализируется нулем и заполняется по мере обработки разделенных элементов списка расположений исправлений. Элемент SlotId структуры D3DDDI_PATCHLOCATIONLIST указывает, какая строка таблицы ресурсов должна быть обновлена, в то время как элемент SplitOffset указывает смещение в буфере DMA, где необходимо выполнить выделение памяти. Буфер DMA можно запустить до точки, указанной SplitOffset, без доступа к ресурсу GPU. Аналогичным образом, если новая запись части местоположения исправления относится к той же SlotId, то предыдущее выделение заменяется новым выделением, и предыдущее выделение больше не требуется (т. е. предыдущее выделение можно удалить из памяти).
При загрузке в память ресурсов, необходимых буферу DMA, диспетчер памяти видео обрабатывает список местоположений патчей, начиная с первого элемента и переходя к последнему элементу. Элементы D3DDDI_PATCHLOCATIONLIST, заполненные драйвером, должны содержать значения в своих элементах SplitOffset; элементы строго возрастают (то есть распределения должны отображаться в порядке использования в потоке). Диспетчер управления видео памятью обрабатывает выделения, на которые ссылаются в списке мест расположения исправлений, в том порядке, в котором они указаны. Когда достигается момент, в котором менеджер видеопамяти больше не может загрузить в память выделение по причине нехватки памяти, менеджер видеопамяти отправляет текущую часть буфера DMA, подготовленную планировщику GPU для выполнения. Буфер DMA выполняется с начала предыдущей точки разделения до значения SplitOffset, указанного для выделения, которое не удалось привести. После отправки диспетчер видеопамяти определяет список необходимых выделений по текущему смещению разделения в потоке DMA с помощью таблицы ресурсов. Все выделения в таблице сохраняются в их текущем физическом расположении, в то время как другие выделения, которые больше не используются, могут быть вытеснены. Затем диспетчер видео-памяти продолжает обрабатывать список местоположений патчей, с возможным повторным делением.
Драйвер должен указывать точки разделения каждый раз, когда распределение привязано или отвязано. Чтобы указать, что выделение не связано, драйвер может указать дескриптор выделения NULL в элементе hDeviceSpecificAllocation элементе-члене структуры DXGK_ALLOCATIONLIST с соответствующим значением в элементе-члене SlotId связанного D3DDDI_PATCHLOCATIONLIST. Драйвер должен отменить привязку больших ресурсов, чтобы повысить вероятность того, что диспетчер памяти видео может решить сложные проблемы размещения памяти.
Аналогичным образом драйвер должен перепрограммировать большие ресурсы на каждой точке разделения. При принятии точки разделения диспетчер памяти видео вынужден оставить ранее привязанное выделение к предыдущему выделению. Это приводит к фрагментации памяти, что может вызвать неспособность решить сложные проблемы размещения памяти, которые могли бы быть решены, если бы не предыдущее ограничение выделения. При вычислении состояния в точке разделения диспетчер видеопамяти определяет, какой идентификатор слота (SlotId) перепрограммируется в этой точке разделения (то есть, каждый элемент списка исправлений, который использует то же значение SplitOffset, что и другие элементы) и игнорирует ограничение размещения для этой точки разделения. Например, если драйвер использует текстуру размером 64 МБ, перепрограммирование текстуры на каждой точке разделения дает диспетчеру памяти видео гибкость перемещения текстуры в памяти между точками разделения при необходимости.