Атрибуты ресурсов в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki
При создании ресурса среди прочих параметров указывается адрес структуры, содержащей описание характеристик этого ресурса. Какая именно необходима структура, зависит от вида ресурса и версии API:
- для создания буфера — D3D10_BUFFER_DESC или D3D11_BUFFER_DESC;
Эти структуры содержат ряд полей, задающих атрибуты создаваемого ресурса. Далее описываются те из них, которые задаются специальными значениями или битовыми масками.
Виды использования ресурса
Вид использования ресурса задаётся одним из значений, определённых в перечислении 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
.