Сопоставление текстур по умолчанию
Использование сопоставления текстур по умолчанию сокращает объем копирования и использования памяти при совместном использовании данных изображений между GPU и ЦП. Однако его следует использовать только в определенных ситуациях. Стандартный макет swizzle позволяет избежать копирования или перевертывания данных в нескольких макетах.
Общие сведения
Сопоставление текстур по умолчанию не должно быть первым выбором для разработчиков. Разработчикам следует сначала использовать дискретный графический процессор (т. е. не иметь доступа к ЦП для большинства текстур и отправлять их с помощью CopySubresourceRegion1). Но в некоторых случаях ЦП и GPU могут так часто взаимодействовать с одними и теми же данными, что сопоставление текстур по умолчанию становится полезным для экономии электроэнергии или ускорения конкретного проектирования на определенных адаптерах или архитектурах. Приложения должны обнаруживать эти случаи и оптимизировать ненужные копии.
В D3D11.3 текстуры, созданные с помощью D3D11_TEXTURE_LAYOUT_UNDEFINED (один из элементов перечисления D3D11_TEXTURE_LAYOUT ) и отсутствие доступа к ЦП, являются наиболее эффективными для частой отрисовки и выборки GPU. При тестировании производительности эти текстуры следует сравнивать с D3D11_TEXTURE_LAYOUT_UNDEFINED с доступом к ЦП, D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE с доступом к ЦП и D3D11_TEXTURE_LAYOUT_ROW_MAJOR для поддержки нескольких адаптеров.
Использование D3D11_TEXTURE_LAYOUT_UNDEFINED с доступом к ЦП позволяет использовать методы WriteToSubresource, ReadFromSubresource, Map (предварительное отключение доступа приложения к указателю) и Unmap; но может пожертвовать эффективностью доступа к GPU. Использование D3D11_TEXTURE_LAYOUT_64K_STANDARD_SWIZZLE с доступом к ЦП позволяет использовать WriteToSubresource, ReadFromSubresource, Map (который возвращает допустимый указатель на приложение) и Отменить сопоставление. Он также может пожертвовать эффективностью доступа к GPU более чем D3D11_TEXTURE_LAYOUT_UNDEFINED с доступом к ЦП.
Как правило, приложения должны создавать большинство текстур, доступных только для GPU, и с D3D11_TEXTURE_LAYOUT_UNDEFINED.
До использования функции текстур по умолчанию для сопоставления существовал только один стандартизированный макет для многомерных данных: "линейный", также известный как "основной строк". Приложения должны избегать USAGE_STAGING и USAGE_DYNAMIC текстур, если доступно сопоставление по умолчанию. Текстуры USAGE_STAGING и USAGE_DYNAMIC используют линейный макет.
В D3D11.3 (и D3D12) представлен стандартный многомерный макет данных. Это позволяет нескольким единицам обработки работать с одинаковыми данными без копирования данных или переворачивания данных между несколькими макетами. Стандартизированный макет позволяет повысить эффективность за счет сетевых эффектов и позволяет алгоритмам делать короткие сокращения при условии определенного шаблона.
Обратите внимание, что этот стандартный swizzle является аппаратной функцией и может поддерживаться не всеми GPU.
API D3D11.3
В отличие от D3D12, D3D11.3 по умолчанию не поддерживает сопоставление текстур, поэтому необходимо запрашивать D3D11_FEATURE_DATA_D3D11_OPTIONS2. Стандартный swizzle также необходимо запросить с помощью вызова ID3D11Device::CheckFeatureSupport и проверки StandardSwizzle64KBSupported
поля D3D11_FEATURE_DATA_D3D11_OPTIONS2.
Следующие API-интерфейсы ссылались на сопоставление текстур:
Перечисления
- D3D11_TEXTURE_LAYOUT : управляет шаблоном поворота текстур по умолчанию и включает поддержку карт для текстур по умолчанию.
- D3D11_FEATURE : ссылки D3D11_FEATURE_DATA_D3D11_OPTIONS2.
- D3D11_TILE_COPY_FLAG : содержит флаги для копирования излинейных ресурсов в линейные буферы и из нее.
Структуры
- D3D11_TEXTURE2D_DESC1 : описывает двухd-текстуру. Обратите внимание на вспомогательную структуру CD3D11_TEXTURE2D_DESC1.
- D3D11_TEXTURE3D_DESC1 : описывает трехмерную текстуру. Обратите внимание на вспомогательную структуру CD3D11_TEXTURE3D_DESC1.
Методы
- ID3D11Device3::CreateTexture2D1 : создает массив двухd-текстур.
- ID3D11Device3::CreateTexture3D1 : создает одну трехмерную текстуру.
- ID3D11Device3::WriteToSubresource : копирует данные в D3D11_USAGE_DEFAULT текстуру, сопоставленную с помощью map.
- ID3D11Device3::ReadFromSubresource : копирует данные из текстуры D3D11_USAGE_DEFAULT, сопоставленной с помощью карты.
- ID3D11DeviceContext::Map : получает указатель на данные, содержащиеся в подресурсе, и запрещает GPU доступ к подресурсу.
- ID3D11DeviceContext::Unmap : делает недействительным указатель на ресурс и повторно вносит доступ GPU к такому ресурсу.
- ID3D11Texture2D1::GetDesc1 : возвращает свойства ресурса двухd-текстуры.
- ID3D11Texture3D1::GetDesc1 : возвращает свойства ресурса трехмерной текстуры.
Связанные темы