Migrating to direct3d 11

Вычислительные шейдеры и неупорядоченная память

Direct3D 11 вводит новый тип шейдера — вычислительный шейдер (Compute Shader). Вычислительный шейдер вызывается как регулярный массив потоков. Потоки делятся на группы. Каждая группа имеет 32 Кб памяти, разделяемой между потоками группы. Таким образом потоки в группе могут обмениваться результатами, улучшая свою производительность. Также потоки могут производить чтения и записи с произвольным доступом к графическим ресурсам: текстурам, массивам вершин, рендер таргетам. Эти доступы к памяти неупорядочены, хотя синхронизация различных инструкций осуществляется, когда это действительно необходимо.

Пиксельные (фрагментные) шейдеры могут также читать по произвольному адресу, что позволяет записывать структуры данных, которые могут быть затем использованы в вычислительном шейдере, или наоборот. Стоит отметить, что пиксельные шейдеры всегда имели возможность произвольного доступа на чтение через текстурные лукапы.

Вычислительные шейдеры могут также производить операции такие, как summed-area tables, быстрое Фурье-преобразование значительно быстрее, чем ранее применяемые методы на графическом процессоре. На данный момент Microsoft исследует библиотеки, обеспечивающие подобные расчёты. Microsoft считает, что алгоритмы, такие как A-буфер визуализация и трассировка лучей могут также быть осуществлены эффективно, но на данный момент нет реальных показателей, свидетельствующих об их эффективности.

Вызов вычислительного шейдера заменяет все стадии конвейера визуализации. Тем не менее, можно смешивать вычислительные шейдеры и традиционный рендер путём использования их результатов. Например, обработка изображения после визуализации вычислительным шейдером (можно загружать дополнительные структуры данных).

Decoding

To create the decoder device, call ID3D11VideoDevice::CreateVideoDecoder. The method returns a pointer to the ID3D11VideoDecoder interface. Decoding should occur inside the IMFTransform::ProcessOutput method. On each frame, call IMFDXGIDeviceManager::TestDevice to test the availability of the DXGI. If the device has changed, the software decoder must recreate the decoder device, as follows:

  1. Close the device handle by calling IMFDXGIDeviceManager::CloseDeviceHandle.
  2. Release all resources associated with the previous Direct3D 11 device, including the ID3D11VideoDecoder, ID3D11VideoContext, ID3D11Texture2D, and ID3D11VideoDecoderOutputView interfaces.
  3. Open a new device handle.
  4. Negotiate a new decoder configuration, as described previously in . This step is necessary because the device capabilities might have changed.
  5. Create a new decoder device.

Assuming that the device handle is valid, the decoding process works as follows:

  1. Get an available surface that is not currently in use. Initially, all of the surfaces are available.
  2. Query the media sample for the IMFTrackedSample interface.
  3. Call IMFTrackedSample::SetAllocator and provide a pointer to the IMFAsyncCallback interface. (The software decoder must implement this interface.) When the video renderer releases the sample, the callback will be invoked. Use this callback to keep track of which samples are currently available and which are in use.
  4. Call ID3D11VideoContext::DecoderBeginFrame. Pass in the pointers to the ID3D11VideoDecoder interface for the decoder device and the ID3D11VideoDecoderOutputView interface for the output view.
  5. Do the following one or more times:
    1. Call ID3D11VideoContext::GetDecoderBuffer to get a buffer.
    2. Fill the buffer.
    3. Call ID3D11VideoContext::ReleaseDecoderBuffer.
    4. Call ID3D11VideoContext::SubmitDecoderBuffer. This method instructs the decoder device to perform the decoding operations on the frame.
  6. Call ID3D11VideoContext::DecoderEndFrame to signal the end of decoding for the current frame.

Direct3D 11 uses the same data structures as DXVA 2.0 for decoding operations. For the original set of DXVA profiles (for H.261, H.263, and MPEG-2), these data structures are described in the DXVA 1.0 specification.

Within each pair of DecoderBeginFrame and SubmitDecoderBuffer calls, you may call GetDecoderBuffer multiple times, but only once for each type of buffer. If you use the same buffer type twice without calling SubmitDecoderBuffer, you will overwrite the data in the buffer.

D3D11Install.exe

Note

D3D11Install.exe requires D3D11InstallHelper.dll to execute.

D3D11Install.exe is a tool for using D3D11InstallHelper.dll as a stand-alone installer complete with UI and end-user messages, as well as acting as an example for proper use of the DLL. The process exits with a 0 if Direct3D 11 is already installed, if the system update applies successfully without requiring a system restart, if a Service Pack installation is required, or if Direct3D 11 is not supported by this computer. A 1 is returned if the system update is applied successfully and requires a system restart to complete. A 2 is returned for other error conditions. Note that this executable file requires administrator rights to run, and it has a manifest that requests elevation when run on Windows Vista or Windows 7 with UAC enabled. D3D11Install.exe can be used as a stand-alone tool for deploying the Direct3D 11 update, or it can be used directly by installers.

It supports the following command-line switches:

/quiet

Displays no messages, prompts, progress dialog boxes, or error messages.

/passive

Displays no messages, prompts, or error messages, but will show the progress dialog box.

/minimal

Shows only minimal prompts.

/y

Suppresses prompting to confirm installing the update, if needed and applicable, for a standard and minimal installation.

/langid decimal

Forces which language identifier code to use when displaying end-user messages and dialog box resources. The default value is 1024, which uses the system default language setting.

/wu

Forces use of Windows Update rather than the system default, which may be Windows Server Update Services (WSUS) running on a managed server or some other non-standard configuration.

Methods

The ID3D11Device interface has these methods.

Method Description
ID3D11Device::CheckCounter Get the type, name, units of measure, and a description of an existing counter.
ID3D11Device::CheckCounterInfo Get a counter’s information.
ID3D11Device::CheckFeatureSupport Gets information about the features that are supported by the current graphics driver.
ID3D11Device::CheckFormatSupport Get the support of a given format on the installed video device.
ID3D11Device::CheckMultisampleQualityLevels Get the number of quality levels available during multisampling.
ID3D11Device::CreateBlendState Create a blend-state object that encapsules blend state for the output-merger stage.
ID3D11Device::CreateBuffer Creates a buffer (vertex buffer, index buffer, or shader-constant buffer).
ID3D11Device::CreateClassLinkage Creates class linkage libraries to enable dynamic shader linkage.
ID3D11Device::CreateComputeShader Create a compute shader.
ID3D11Device::CreateCounter Create a counter object for measuring GPU performance.
ID3D11Device::CreateDeferredContext Creates a deferred context, which can record command lists.
ID3D11Device::CreateDepthStencilState Create a depth-stencil state object that encapsulates depth-stencil test information for the output-merger stage.
ID3D11Device::CreateDepthStencilView Create a depth-stencil view for accessing resource data.
ID3D11Device::CreateDomainShader Create a domain shader.
ID3D11Device::CreateGeometryShader Create a geometry shader.
ID3D11Device::CreateGeometryShaderWithStreamOutput Creates a geometry shader that can write to streaming output buffers.
ID3D11Device::CreateHullShader Create a hull shader.
ID3D11Device::CreateInputLayout Create an input-layout object to describe the input-buffer data for the input-assembler stage.
ID3D11Device::CreatePixelShader Create a pixel shader.
ID3D11Device::CreatePredicate Creates a predicate.
ID3D11Device::CreateQuery This interface encapsulates methods for querying information from the GPU.
ID3D11Device::CreateRasterizerState Create a rasterizer state object that tells the rasterizer stage how to behave.
ID3D11Device::CreateRenderTargetView Creates a render-target view for accessing resource data.
ID3D11Device::CreateSamplerState Create a sampler-state object that encapsulates sampling information for a texture.
ID3D11Device::CreateShaderResourceView Create a shader-resource view for accessing data in a resource.
ID3D11Device::CreateTexture1D Creates an array of 1D textures.
ID3D11Device::CreateTexture2D Create an array of 2D textures.
ID3D11Device::CreateTexture3D Create a single 3D texture.
ID3D11Device::CreateUnorderedAccessView Creates a view for accessing an unordered access resource.
ID3D11Device::CreateVertexShader Create a vertex-shader object from a compiled shader.
ID3D11Device::GetCreationFlags Get the flags used during the call to create the device with D3D11CreateDevice.
ID3D11Device::GetDeviceRemovedReason Get the reason why the device was removed.
ID3D11Device::GetExceptionMode Get the exception-mode flags.
ID3D11Device::GetFeatureLevel Gets the feature level of the hardware device.
ID3D11Device::GetImmediateContext Gets an immediate context, which can play back command lists.
ID3D11Device::GetPrivateData Get application-defined data from a device.
ID3D11Device::OpenSharedResource Give a device access to a shared resource created on a different device.
ID3D11Device::SetExceptionMode Get the exception-mode flags.
ID3D11Device::SetPrivateData Set data to a device and associate that data with a guid.
ID3D11Device::SetPrivateDataInterface Associate an IUnknown-derived interface with this device child and associate that interface with an application-defined guid.

Как пользоваться

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

Загрузка и установка

Давайте бесплатно скачаем и установим наш драйвер. Для этого предпринимаем ряд простых 3 шагов:

  1. Жмем кнопку, которая позволит скачать архив с нужным нам файлом.
  2. Распаковываем архив и извлекаем исполняемый компонент.
  3. Запускаем установщик DirectX 9 и следуя подсказкам, например, куда установить, создать ли ярлыки и т. д., производим инсталляцию системной библиотеки от Microsoft.

  1. Закрываем установщик и перезагружаем наш ПК.

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

Инструкция по работе

Вся суть использования библиотеки DirectX для Windows XP, 7, 8 и 10, сводится к следующему: вы просто запускаете игру или программу, которая подразумевает работу в связке с DirectX 9. Никаких дополнительных настроек производить не нужно. Единственное, что следует сделать, после установки библиотеки, это перезагрузить ваш компьютер.

Для того чтобы включить DirectX 9 на Windows 10 необходимо посетить панель управления, найти там раздел «Программы и компоненты», выбрать «Включение или отключение компонентов Windows», а потом установить флажок напротив пункта «Компоненты прежних версий».

Еще один очень частый вопрос – «как поменять DirectX 11 на 9 на Windows 7?». Менять их не нужно, библиотеки работают параллельно, и каждая из них используется для своих задач.

Устройства и контекст устройстваDevices and device context

Устройство Direct3D 11 представляет собой виртуализованный графический адаптер.A Direct3D 11 device represents a virtualized graphics adapter. Оно используется для создания ресурсов в видеопамяти, например для отправки текстур графическому процессору (GPU), создания представлений на основе ресурсов текстуры и цепочек буферов и для создания дискретизаторов текстур.It’s used to create resources in video memory, for example: uploading textures to the GPU, creating views on texture resources and swap chains, and creating texture samplers. Полный перечень способов использования интерфейса устройства Direct3D 11 приведен в разделах ID3D11Device и ID3D11Device1.For a complete list of what a Direct3D 11 device interface is used for see ID3D11Device and ID3D11Device1.

Контекст устройства Direct3D 11A Direct3D 11. используется для настройки состояния конвейера и создания команд отрисовки.device context is used to set pipeline state and generate rendering commands. Например, цепочка отрисовки Direct3D 11 использует контекст устройства для настройки цепочки отрисовки и рисования сцены (см. ниже).For example, a Direct3D 11 rendering chain uses a device context to set up the rendering chain and draw the scene (see below). Контекст устройства применяется для доступа к видеопамяти (сопоставления), которую используют ресурсы устройства Direct3D, а также для обновления данных подресурсов, например данных буфера констант.The device context is used to access (map) video memory used by Direct3D device resources; it’s also used to update subresource data, for example constant buffer data. Полный перечень способов использования контекста устройства Direct3D 11 приведен в разделах ID3D11DeviceContext и ID3D11DeviceContext1.For a complete list of what a Direct3D 11 device context is used for see ID3D11DeviceContext and ID3D11DeviceContext1

Обратите внимание, что большинство наших образцов используют мгновенный контекст для обработки напрямую на устройстве, но Direct3D 11 также поддерживает и отложенные контексты устройств, которые применяются преимущественно для многопоточности.Note that most of our samples use an immediate context to render directly to the device, but Direct3D 11 also supports deferred device contexts, which are primarily used for multithreading

Чтобы получить маркер устройства и маркер контекста устройства, в Direct3D 11 вызывается D3D11CreateDevice.In Direct3D 11, the device handle and device context handle are both obtained by calling D3D11CreateDevice. В этом методе также запрашивается определенный набор аппаратных функций и извлекаются сведения об уровнях компонентов Direct3D, которые поддерживает графический адаптер.This method is also where you request a specific set of hardware features and retrieve information on Direct3D feature levels supported by the graphics adapter. Дополнительные сведения об устройствах, контекстах устройств и потоковой модели см. в разделе Вводные сведения об устройстве в Direct3D 11.See Introduction to a Device in Direct3D 11 for more info on devices, device contexts, and threading considerations.

Как скачать D3D11.dll для Windows 7

В Windows 7 по умолчанию может не быть файла d3d11.dll, а в тех образах, где он присутствует, может не работать с новыми играми, вызывая ошибки инициализации D3D11.

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

А вдруг и это будет интересно:

Почему бы не подписаться?

01.04.2019 в 08:47

Здравствуйте! Подскажите пожалуйста, при запуске визуализации выдает ошибку «D3D object has a non-zero reference count (meaning things were not properly cleaned up). This visualizer will now exit.» что делать?

01.04.2019 в 10:59

Здравствуйте. Не знаком с ошибкой. В первую очередь, конечно, загрузите DirectX через веб-установщик (я понимаю, что уже установлен, но веб-установщик установит недостающее), а также обновите драйверы видеокарты. А дальше уже — не знаю. Погуглил по проблему, в одной игре из Steam (Path of Exile) она широко обсуждается, решают там правкой .ini файла, включая оконный режим (а у вас и так оконный на скрине) и меняя разрешение. Так что не уверен, что для вашего ПО применим метод.

02.08.2019 в 08:17

Здраствуйте. У меня ошибка немного другая. Когда я пытаюсь запустить Fortnite, выдаёт: failed to find a graphics adapter with the minimum required DX11 feature level. Пыталась удалить все деректы, но всё равно остаётся 12-ый. Помогите пожалуйста.

02.08.2019 в 11:41

Здравствуйте. Сообщение говорит о том, что не найдена графическая карта, которая бы поддерживала минимально требуемый DirectX 11. Т.е. либо видеокарта действительно старая, либо драйверы на нее не стоят правильные.

Примечание: после отправки комментария он не появляется на странице сразу. Всё в порядке — ваше сообщение получено. Ответы на комментарии и их публикация выполняются ежедневно днём, иногда чаще. Возвращайтесь.

To handle the diversity of video cards in new and existing machines, Microsoft Direct3DВ 11 introduces the concept of feature levels. This topic discusses Direct3D feature levels.

Each video card implements a certain level of Microsoft DirectX (DX) functionality depending on the graphics processing units (GPUs) installed. In prior versions of Microsoft Direct3D, you could find out the version of Direct3D the video card implemented, and then program your application accordingly.

With Direct3DВ 11, a new paradigm is introduced called feature levels. A feature level is a well defined set of GPU functionality. For instance, the 9_1 feature level implements the functionality that was implemented in Microsoft Direct3DВ 9, which exposes the capabilities of shader models ps_2_x and vs_2_x, while the 11_0 feature level implements the functionality that was implemented in Direct3DВ 11.

Now when you create a device, you can attempt to create a device for the feature level that you want to request. If the device creation works, that feature level exists, if not, the hardware does not support that feature level. You can either try to recreate a device at a lower feature level or you can choose to exit the application. For more info about creating a device, see the D3D11CreateDevice function.

Using feature levels, you can develop an application for Direct3DВ 9, Microsoft Direct3DВ 10, or Direct3DВ 11, and then run it on 9, 10 or 11 hardware (with some exceptions; for example, new 11 features will not run on an existing 9 card). Here is a couple of other basic properties of feature levels:

  • A GPU that allows a device to be created meets or exceeds the functionality of that feature level.
  • A feature level always includes the functionality of previous or lower feature levels.
  • A feature level does not imply performance, only functionality. Performance is dependent on hardware implementation.
  • Choose a feature level when you create a Direct3DВ 11 device.

For information about limitations creating nonhardware-type devices on certain feature levels, see Limitations Creating WARP and Reference Devices.

To assist you in deciding what feature level to design with, compare the features for each feature level.

The 10Level9 Reference section lists the differences between how various ID3D11Device and ID3D11DeviceContext methods behave at various 10Level9 feature levels.

Which Direct3D APIs can you use?

The Direct3D APIs that you choose depend on the style of app you want to write.

  • If you want to write a UWP app, use a subset of Direct3D 11, DXGI, and HLSL APIs. For a list of these APIs, see Win32 and COM APIs for UWP apps. To learn how to write a Direct3D 11 Windows Store app, see Create 3D graphics with DirectX.
  • If you write a desktop app, you can use the full set of Direct3D 11, DXGI, and HLSL APIs.
  • Starting with Windows 8, we no longer actively support the XNA framework for desktop apps. But Windows Store apps, UWP apps, and desktop apps can use the full set of the XAudio2 and DirectXMath APIs. Desktop apps can use the full set of the XInput APIs, while Windows Store apps and UWP apps can use most of the XInput APIs; for more info, see XInput Versions.

Checking Errors

If during compilation an error occurs, the API returns an interface that contains the errors from the effect compiler. This interface is called ID3DBlob. It is not directly readable; however, by returning a pointer to the buffer that contains the data (which is a string), you can see any compilation errors.

This example contains an error in the BasicHLSL.fx, the first variable declaration occurs twice.

This error causes the compiler to return the following error, as shown in the following screen shot of the Watch window in Microsoft Visual Studio.

Because the compiler returns the error in a LPVOID pointer, cast it to a character string in the Watch window.

Here is the code that returns the error from the failed compile.

Замена DirectPlay на сетевой кодReplace DirectPlay with networking code

Microsoft DirectPlay устарел.Microsoft DirectPlay has been deprecated. Если ваша игра использует сетевые службы, вам нужно предоставить сетевой код, соответствующий требованиям сертификации UWP.If your game uses network services, you need to provide networking code that complies with UWP requirements. Используйте следующие API:Use the following APIs:

  • Win32 и COM для приложений UWP apps (сеть) (Windows)Win32 and COM for UWP apps (networking) (Windows)
  • Пространство имен Windows.Networking (Windows)Windows.Networking namespace (Windows)
  • Пространство имен Windows.Networking.Sockets (Windows)Windows.Networking.Sockets namespace (Windows)
  • Пространство имен Windows.Networking.Connectivity (Windows)Windows.Networking.Connectivity namespace (Windows)
  • Пространство имен Windows.ApplicationModel.Background (Windows)Windows.ApplicationModel.Background namespace (Windows)

Следующие статьи помогут вам добавить сетевые возможности и объявить поддержку сети в манифесте пакета приложения.The following articles help you add networking features and declare support for networking in your app’s package manifest.

  • Подключение с помощью сокетов (приложения UWP на C#, VB, C++ и XAML) (Windows)Connecting with sockets (UWP apps using C#/VB/C++ and XAML) (Windows)
  • Подключение с помощью WebSockets (приложения UWP на C#, VB, C++ и XAML) (Windows)Connecting with WebSockets (UWP apps using C#/VB/C++ and XAML) (Windows)
  • Подключение к веб-службам (приложения UWP на C#, VB, C++ и XAML) (Windows)Connecting to web services (UWP apps using C#/VB/C++ and XAML) (Windows)
  • Основы работы с сетямиNetworking basics

Обратите внимание, что все приложения UWP (включая игры) используют специфические типы фоновых задач для поддержки подключения, когда приложение приостановлено.Note that all UWP apps (including games) use specific types of background tasks to maintain connectivity while the app is suspended. Если вашей игре необходимо поддерживать подключенное состояние во время приостановки, см

раздел Основы работы в сети.If your game needs to maintain connection state while suspended see Networking basics.

Device Context

A device context contains the circumstance or setting in which a device is used. More specifically, a device context is used to set pipeline state and generate rendering commands using the resources owned by a device. Direct3D 11 implements two types of device contexts, one for immediate rendering and the other for deferred rendering; both contexts are represented with an ID3D11DeviceContext interface.

Immediate Context

An immediate context renders directly to the driver. Each device has one and only one immediate context which can retrieve data from the GPU. An immediate context can be used to immediately render (or play back) a command list.

There are two ways to get an immediate context:

  • By calling either D3D11CreateDevice or D3D11CreateDeviceAndSwapChain.
  • By calling ID3D11Device::GetImmediateContext.

Deferred Context

A deferred context records GPU commands into a command list. A deferred context is primarily used for multithreading and is not necessary for a single-threaded application. A deferred context is generally used by a worker thread instead of the main rendering thread. When you create a deferred context, it does not inherit any state from the immediate context.

To get a deferred context, call ID3D11Device::CreateDeferredContext.

Any context — immediate or deferred — can be used on any thread as long as the context is only used in one thread at a time.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий