Атрибуты ресурсов в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki

При создании ресурса среди прочих параметров указывается адрес структуры, содержащей описание характеристик этого ресурса. Какая именно необходима структура, зависит от вида ресурса и версии API:

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

Виды использования ресурса

Вид использования ресурса задаётся одним из значений, определённых в перечислении D3D10_USAGE или D3D11_USAGE.

  • D3D10_USAGE_DEFAULT или D3D11_USAGE_DEFAULT — буфер, оптимизированный для чтения и записи графическим процессором. Центральный процессор может менять содержимое этого буфера методом ID3D11DeviceContext::UpdateSubresource, но это достаточно медленная и неэффективная операция.

  • D3D10_USAGE_IMMUTABLE или D3D11_USAGE_IMMUTABLE — буфер, используемый только графическим процессором и только для считывания; содержимое такого буфера устанавливается в момент его создания.

  • D3D10_USAGE_DYNAMIC или D3D11_USAGE_DYNAMIC — буфер записывается центральным процессором и считывается графическим процессором; хорошо подходит для данных, которые должны часто изменяться (например, каждый кадр). Возможность считывания содержимого буфера центральным процессором не гарантируется.

  • D3D10_USAGE_STAGING или D3D11_USAGE_STAGING — буфер для доступа со стороны центрального процессора; графический процессор может лишь выполнять пересылку (копирование) данных в таком буфере с помощью методов ID3D11DeviceContext::CopySubresourceRegion и ID3D11DeviceContext::CopyResource.

Вид ресурса и способ его привязки

Задаётся битовой маской, чти разряды определены в перечислении D3D10_BIND_FLAG или D3D11_BIND_FLAG.

  • D3D10_BIND_VERTEX_BUFFER или D3D11_BIND_VERTEX_BUFFER — вершинный буфер, привязываемый к стадии сбора исходных данных.

  • D3D10_BIND_INDEX_BUFFER или D3D11_BIND_INDEX_BUFFER — индексный буфер, привязываемый к стадии сбора исходных данных.

  • D3D10_BIND_CONSTANT_BUFFER или D3D11_BIND_CONSTANT_BUFFER — константный буфер, привязываемый к какой-либо из шейдерных стадий. Этот флаг не может комбинироваться с какими-либо другими флагами.

  • D3D10_BIND_SHADER_RESOURCE или D3D11_BIND_SHADER_RESOURCE — буфер или текстура, привязываемые к какой-либо шейдерной стадии с помощью представления шейдерного ресурса. Содержимое такого ресурсу не может обновляться с использованием флага D3D11_MAP_WRITE_NO_OVERWRITE.

    Direct3D11.1 разрешает отображение динамических константных буферов и представлений шейдерных ресурсов, используя флаг D3D10_MAP_WRITE_NO_OVERWRITE или D3D11_MAP_WRITE_NO_OVERWRITE. В более ранних версиях API возможность использования этого флага можно проверить с помощью метода ID3D11Device::CheckFeatureSupport.

  • D3D10_BIND_STREAM_OUTPUT или D3D11_BIND_STREAM_OUTPUT — выходной буфер для стадии потокового вывода.

  • D3D10_BIND_RENDER_TARGET или D3D11_BIND_RENDER_TARGET — текстура, используемая как цель рендеринга в стадии вывода и слияния.

  • D3D10_BIND_DEPTH_STENCIL или D3D11_BIND_DEPTH_STENCIL — текстура, используемая как буфер глубины и шаблона в стадии вывода и слияния.

  • D3D11_BIND_UNORDERED_ACCESS (Direct3D11) — ресурс с неупорядоченным доступом.

  • D3D11_BIND_DECODER (Direct3D11.1) — двухмерная текстура или массив таких текстур, куда записывается результат вызова API декодирования. Созданные с этим флагом ресурсы не могут использоваться методом ID3D11Device::CreateShaderResourceView.

  • D3D11_BIND_VIDEO_ENCODER (Direct3D11.1) — двухмерная текстура или массив таких текстур, куда записывается входная информация API кодирования. Созданные с этим флагом ресурсы не могут использоваться методом ID3D11Device::CreateShaderResourceView.

Возможности доступа со стороны центрального процессора

Задаются комбинацией флагов из перечисления D3D10_CPU_ACCESS_FLAG или D3D11_CPU_ACCESS_FLAG. Если доступ со стороны ЦП не нужен, значениие этого параметра должно быть нулевым (это способствует повышению производительности).

  • D3D10_CPU_ACCESS_WRITE или D3D11_CPU_ACCESS_WRITE — ресурс может быть отображён для записи в него со стороны процессора. Этот ресурс не может использоваться для вывода результатов работы графического конвейера и должен создаваться с видом использования D3D10_USAGE_STAGING/D3D11_USAGE_STAGING или D3D10_USAGE_DYNAMIC/D3D11_USAGE_DYNAMIC.

  • D3D10_CPU_ACCESS_READ или D3D11_CPU_ACCESS_READ — ресурс может использоваться центральным процессором для считывания. Он не может использоваться графическим процессором ни для считывания, ни для записи (не считая выполнения операции копирования) и должен иметь вид использования D3D10_USAGE_STAGING/D3D11_USAGE_STAGING.

Различные характеристики ресурса

Задаются битовой маской, флаги которой определены в перечислении D3D10_RESOURCE_MISC_FLAG или D3D11_RESOURCE_MISC_FLAG.

  • D3D10_RESOURCE_MISC_GENERATE_MIPS или D3D11_RESOURCE_MISC_GENERATE_MIPS — разрешает генерацию mipmap-уровней текстуры вызовом метода ID3D10Device::GenerateMips или ID3D11DeviceContext::GenerateMips. Текстура должна создаваться с флагами привязки, делающими её целью рендеринга (D3D10_BIND_RENDER_TARGET/D3D11_BIND_RENDER_TARGET) и шейдерным ресурсом (D3D10_BIND_SHADER_RESOURCE/D3D11_BIND_SHADER_RESOURCE).

  • D3D10_RESOURCE_MISC_SHARED или D3D11_RESOURCE_MISC_SHARED — разрешает совместное использование данных ресурса несколькими устройствами Direct3D. Этот флаг может указываться только для двухмерной текстуры без mipmap-уровней.

    Устройства типов REF (в любой ОС) и WARP (до Windows 8) не поддерживают совместное использование ресурсов.

    Данный флаг является взаимноисключающим с флагом D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX/D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX. Начиная с Windows 8, вместо D3D11_RESOURCE_MISC_SHARED рекомендуется использовать комбинацию флагов D3D11_RESOURCE_MISC_SHARED_NTHANDLE и D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX.

  • D3D10_RESOURCE_MISC_TEXTURECUBE или D3D11_RESOURCE_MISC_TEXTURECUBE — ресурс является текстурным кубом (для этого он должен быть массивом из шести двухмерных текстур).

  • D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS (Direct3D11) — разрешает воплощение сгенерированного графическим процессором контекста.

  • D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS (Direct3D11) — разрешает использование ресурса как сырого буфера.

  • D3D11_RESOURCE_MISC_BUFFER_STRUCTURED (Direct3D11) — разрешает использование ресурса как структурного буфера.

  • D3D11_RESOURCE_MISC_RESOURCE_CLAMP (Direct3D11) — разрешает ограничивать использование mipmap-уровней ресурса с помощью метода ID3D11DeviceContext::SetResourceMinLOD.

  • D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX или D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX — разрешает синхронизацию доступа к ресурсу с помощью интерфейса IDXGIKeyedMutex, который будет создан одновременно с самим ресурсом. Для получения этого интерфейса следует вызвать обычный метод IUnknown::QueryInterface из интерфейса ресурса.

    Любое устройство Direct3D, открывающее доступ к разделяемому ресурсу вызовом метода ID3D10Device::OpenSharedResource или ID3D11Device::OpenSharedResource, должно захватывать ресурс перед началом рендеринга и освобождать его после завершения рендеринга с помощью соответствующих методов интерфейса IDXGIKeyedMutex.

    Устройство типа REF, а также устройство типа WARP до Windows 8 не поддерживают разделяемые ресурсы.

    Данный флаг является взаимноисключающим с флагом D3D10_RESOURCE_MISC_SHARED/D3D11_RESOURCE_MISC_SHARED.

  • D3D10_RESOURCE_MISC_GDI_COMPATIBLE или D3D11_RESOURCE_MISC_GDI_COMPATIBLE — разрешает совместное использование ресурса с GDI, что технически сводится к возможности вызова метода IDXGISurface1::GetDC и последующему рендерингу в поверхность DXGI средствами GDI.

    Этот флаг является взаимоисключающим с любым из флагов D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX и D3D11_RESOURCE_MISC_RESOURCE_CLAMP. Он может использоваться только с двухмерной текстурой без мультисэмплинга, не имеющей mipmap-уровней, допускающей использование как цель рендеринга (флаг D3D11_BIND_RENDER_TARGET) и позволяющей графическому процессору читать и записывать её содержимое (константа D3D11_USAGE_DEFAULT) и хранящей данные в одном из форматов DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_TYPELESS или DXGI_FORMAT_B8G8R8A8_UNORM_SRGB.

  • D3D11_RESOURCE_MISC_SHARED_NTHANDLE (Direct3D11.1) — требует использования хэндла NT при создании разделяемого ресурса и выполнения строгой проверки совместимости ресурса с используемым оборудованием. Без этого флага строгая проверка не выполняется, что может привести к неопределённому поведению.

  • D3D11_RESOURCE_MISC_RESTRICTED_CONTENT (Direct3D11.1) — указывает, что ресурс содержит защищённый контент, и запрещает создавать этот ресурс, если драйвер или аппаратура не обеспечивают защиту.

  • D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE (Direct3D11.1) — указывает, что ОС должна ограничивать доступ к разделяемому ресурсу. Этот флаг может использоваться совместно со следующим; он применяется только при создании разделяемых поверхностей.

  • D3D11_RESOURCE_MISC_RESTRICT_SHARED_RESOURCE_DRIVER (Direct3D11.1) — указывает, что драйвер должен ограничивать доступ к разделяемому ресурсу. Этот флаг может использоваться совместно с предыдущим; он применяется только при создании разделяемых поверхностей.

  • D3D11_RESOURCE_MISC_GUARDED (Direct3D11.1) — указывает, что ресурс является охраняемым. Такой ресурс возвращается методами IDCompositionSurface::BeginDraw и ISurfaceImageSourceNative::BeginDraw. При их вызове указывается область интереса в ресурсе (ROI), и любые операции будут ограничены лишь этой областью. Охраняемый ресурс несовместим с рендерингом во множество целей (MRT), т. е., если он используется для рендеринга, он должен быть единственной целью.

  • D3D11_RESOURCE_MISC_TILE_POOL (Direct3D11.2) — указывает, что ресурс является кучей плиток.

  • D3D11_RESOURCE_MISC_TILED (Direct3D11.2) — указывает, что ресурс является плиточным.

  • D3D11_RESOURCE_MISC_HW_PROTECTED (Direct3D11.3?) — указывает, что ресурс должен защищаться аппаратно. Если это невозможно, ресурс создан не будет.

    Защищаемый аппаратно ресурс не может быть доступен центральному процессору. Кроме того, он несовместим с флагами D3D11_USAGE_DYNAMIC, D3D11_USAGE_STAGING, D3D11_BIND_VERTEX_BUFFER и D3D11_BIND_INDEX_BUFFER.