структура D3DDDICB_LOCKFLAGS (d3dukmdt.h)

Структура D3DDDICB_LOCKFLAGS определяет, как заблокировать выделение.

Синтаксис

typedef struct _D3DDDICB_LOCKFLAGS {
  union {
    struct {
      UINT ReadOnly : 1;
      UINT WriteOnly : 1;
      UINT DonotWait : 1;
      UINT IgnoreSync : 1;
      UINT LockEntire : 1;
      UINT DonotEvict : 1;
      UINT AcquireAperture : 1;
      UINT Discard : 1;
      UINT NoExistingReference : 1;
      UINT UseAlternateVA : 1;
      UINT IgnoreReadSync : 1;
      UINT Reserved : 21;
    };
    UINT Value;
  };
} D3DDDICB_LOCKFLAGS;

Члены

ReadOnly

Значение UINT, указывающее, можно ли только считывать заблокированное выделение. Задание этого элемента эквивалентно установке первого бита 32-разрядного элемента Value (0x00000001).

WriteOnly

Значение UINT, указывающее, можно ли записывать заблокированное выделение. Задание этого элемента эквивалентно установке второго бита 32-разрядного элемента Value (0x00000002).

DonotWait

Значение UINT, указывающее, должен ли диспетчер видеопамяти ждать блокировки выделения. Если этот элемент задан, диспетчер памяти завершает вызов pfnLockCb с D3DERR_WASSTILLDRAWING, если графическое оборудование использует выделение.

Задание этого элемента эквивалентно установке третьего бита 32-разрядного элемента Value (0x00000004).

IgnoreSync

Значение UINT, указывающее, должен ли диспетчер видеопамяти проверка, использует ли графическое оборудование выделение. Если этот элемент задан, диспетчер памяти не должен проверка.

IgnoreSync можно задать только с выделением, которое можно поместить в сегмент диафрагмы. Его нельзя задать с помощью свернутого выделения или выделения в кэше, если когерентность кэша не поддерживается графическим адаптером.

Задание этого элемента эквивалентно установке четвертого бита 32-разрядного элемента Value (0x00000008).

LockEntire

Значение UINT, указывающее, является ли весь регион распределения заблокированным, а не только подобласти.

Задание этого элемента эквивалентно установке пятого бита 32-разрядного элемента Value (0x00000010).

DonotEvict

Значение UINT, указывающее, должен ли диспетчер видеопамяти исключить выделение, чтобы блокировка была успешной. Если этот элемент задан, диспетчер памяти не должен исключить выделение. Если выделение должно быть вытеснено для обработки запроса на блокировку, диспетчер памяти завершает вызов pfnLockCb с D3DERR_NOTAVAILABLE. Вытеснение может потребоваться, если все диафрагмы дескрипторов исчерпаны.

Задание этого элемента эквивалентно установке шестого бита 32-разрядного элемента Value (0x00000020).

AcquireAperture

Значение UINT, указывающее, должен ли диспетчер видеопамяти вызывать функцию DxgkDdiAcquireSwizzlingRange драйвера дисплея miniport для настройки распаковки диафрагмы для выделения.

Выделение, которое было заблокировано без параметра AcquireAperture , невозможно снова заблокировать с помощью AcquireAperture .

Не удается задать AcquireAperture, если выделение может находиться только в сегменте диафрагмы.

Задание этого элемента эквивалентно установке седьмого бита 32-разрядного элемента Value (0x00000040).

Discard

Значение UINT, указывающее, может ли диспетчер видеопамяти переименовывать выделение или выполнять несколько буферов. Дополнительные сведения о переименовании выделений см. в разделе Запрос на переименование выделения.

Отмена игнорируется для закрепленных, первичных или общих выделений.

Задание этого элемента эквивалентно установке восьмого бита 32-разрядного элемента Value (0x00000080).

NoExistingReference

Значение UINT, указывающее, не помещает ли драйвер отображения пользовательского режима в очередь в буфере команд ссылку на любой экземпляр заблокированного выделения. Драйвер должен использовать член NoExistingReference после того, как диспетчер видеопаметь не выполняет запрос на блокировку, используя только флаг Отменить , и после того, как драйвер сбрасывает свой текущий буфер команд в ядро. Драйвер должен использовать NoExistingReference в сочетании с Отменой.

Задание этого элемента эквивалентно установке девятого бита 32-разрядного элемента Value (0x00000100).

UseAlternateVA

Значение UINT, указывающее, может ли драйвер минипорта дисплея заблокировать выделение по физическому адресу, отличному от текущего расположения сегмента выделения, или с другим объемом памяти, чем было выделено ранее. Если этот флаг указан, драйвер мини-порта отображения может обновить базовый адрес и размер физического диапазона адресов, через который выделен ЦП (путем обновления элементов RangeSize и CPUTranslatedAddressструктуры DXGKARG_ACQUIRESWIZZLINGRANGE в вызове функции DxgkDdiAcquireSwizzlingRange ). Если этот флаг указан, диспетчер видеопамяти пытается выделить новый виртуальный адрес для обработки запроса на блокировку, а не использовать виртуальный адрес резервного хранилища выделения. Однако если диспетчер видеопаметь не может выделить новый виртуальный адрес, запрос на блокировку завершается ошибкой.

Этот флаг также используется для блокировки вращающегося или мозаичного выделения, которые в настоящее время находятся в сегменте диафрагмы, отличном от AGP. При этом типе блокировки диспетчер видеопамяти сопоставляет альтернативный виртуальный адрес с физическим диапазоном адресов, который может быть расвертыван или пока не на лету, а затем перенаправляет доступ к памяти на страницы системной памяти.

Диспетчер видеопамяти создает альтернативный виртуальный адрес при первой блокировке выделения с помощью UseAlternateVA и освобождает виртуальный адрес в одном из следующих сценариев:

  • Выделение недоступно для ЦП, и диапазон поворотов освобождается для повторного использования другим выделением.
  • Выделение недоступно для ЦП и вытеснило.
  • Выделение удаляется.
  • Выделение разгружается в после того, как оно было вытеснино во время блокировки.
Имейте в виду, что UseAlternateVA можно использовать для основного выделения, только если основное выделение было создано путем указания флага битового поля UseAlternateVA в элементе Flags структуры DXGK_ALLOCATIONINFO в вызове функции DxgkDdiCreateAllocation драйвера мини-порта дисплея. Основное выделение, созданное таким образом, можно заблокировать только с помощью флага UseAlternateVA .

UseAlternateVA нельзя использовать в общем выделении.

Выделение, которое было заблокировано с помощью параметра UseAlternateVA , невозможно снова заблокировать.

Примечание Если драйвер отображения пользовательского режима установил UseAlternateVA в элементе Flags структуры D3DDDICB_LOCKFLAGS во время вызова функции pfnLockCb , драйвер мини-порта дисплея не должен вызывать функцию DxgkCbExcludeAdapterAccess .
 
Задание этого элемента эквивалентно установке десятого бита 32-разрядного элемента Value (0x00000200).

IgnoreReadSync

Значение UINT, указывающее, должен ли диспетчер видеопамяти ожидать завершения только ожидающих операций записи графического процессора (GPU) в выделение. Если этот элемент задан, диспетчер памяти не требуется ждать завершения операций чтения GPU. То есть, как только завершится последняя операция записи GPU, блокировка может вернуться, даже если GPU может по-прежнему считывать данные из выделения.

IgnoreReadSync можно задать только с выделением, которое можно поместить в сегмент диафрагмы. Его нельзя задать с помощью свернутого выделения или выделения в кэше, если когерентность кэша не поддерживается графическим адаптером.

Задание этого элемента эквивалентно установке одиннадцатого бита 32-разрядного элемента Value (0x00000400).

Reserved

Этот элемент зарезервирован и должен иметь нулевое значение. Присвоение этому элементу нулевого значения эквивалентно установке нулей для оставшихся 21 битов (0xFFFFF800) элемента 32-разрядного значения .

Value

Элемент в объединении, который содержится в D3DDDICB_LOCKFLAGS, который может содержать одно 32-разрядное значение, определяющее способ блокировки выделения.

Комментарии

При использовании структуры D3DDDICB_LOCKFLAGS для указания способа блокировки выделения необходимо соблюдать следующие правила:

  • Одновременное указание элементов ReadOnly и WriteOnly недопустимо.
  • Элемент IgnoreSync не действует, если он указан с помощью элемента Discard .
  • Элемент DonotWait не действует, если он указан с помощью элемента Отменить .
  • Одновременное указание элементов IgnoreSync и AcquireAperture недопустимо.
  • Поскольку указание элемента UseAlternateVA указывает на получение диафрагмы, необходимо также задать элемент AcquireAperture .
  • Устаревшие или предлагаемые выделения не могут быть заблокированы. См. также раздел Запрос на переименование выделения.
  • Выделение может быть заблокировано только в том случае, если оно было создано с набором элементов CpuVisible в структуре DXGK_ALLOCATIONINFOFLAGS .
  • Только владелец (создатель) общего распределения может заблокировать его, если это не не управляемое основное выделение GDI.
  • Выделение, заблокированное с помощью поворотного диапазона, должно быть разблокировано, прежде чем его можно будет снова заблокировать.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows Vista и более поздних версиях операционных систем Windows.
Верхняя часть d3dukmdt.h (включая D3dukmdt.h)

См. также раздел

D3DDDICB_LOCK

DXGK_ALLOCATIONINFOFLAGS

DxgkDdiAcquireSwizzlingRange

pfnLockCb