Поделиться через


Запрос сведений из GPU

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

Объект запроса — это ресурс, который среда выполнения и драйвер используют для асинхронного уведомления. Чтобы создать объект запроса, среда выполнения сначала вызывает функцию CalcPrivateQuerySize драйвера, чтобы драйвер смог указать размер области памяти, необходимый драйверу для объекта запроса. Затем среда выполнения вызывает функцию CreateQuery(D3D10) драйвера, чтобы создать объект запроса. В вызовах CalcPrivateQuerySize и CreateQuery(D3D10) среда выполнения предоставляет значение типа запроса из перечисления D3D10DDI_QUERY в элементе Queryструктуры D3D10DDIARG_CREATEQUERY , на которую указывают параметры pCreateQuery .

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

ПримечаниеQueryBegin поддерживается всеми типами запросов, за исключением D3D10DDI_QUERY_EVENT и D3D10DDI_QUERY_TIMESTAMP. Концепция здания не существует для D3D10DDI_QUERY_EVENT и D3D10DDI_QUERY_TIMESTAMP.

Среда выполнения вызывает функцию QueryEnd драйвера для перевода объекта запроса в выданное состояние. Переходы в состояние сигнала происходят асинхронно через некоторое время. Среда выполнения вызывает функцию QueryGetData драйвера, чтобы определить, перейдут ли запрос в состояние сигнала. Если запрос находится в состоянии сигнала, QueryGetData может передать обратно данные, которые применяются к запросу в области памяти, на которую указывает параметр pData .

Все объекты запросов одного типа имеют тип FIFO (то есть первый вход, первый выход). Например, все объекты запросов типа D3D10DDI_QUERY_EVENT завершены в порядке FIFO на основе выданного заказа. Однако объекты запросов различных типов могут завершаться или сигнализировать в перекрывающейся последовательности. Например, запрос типа D3D10DDI_QUERY_EVENT может завершиться до запроса типа D3D10DDI_QUERY_OCCLUSION, даже если среда выполнения выдала запрос D3D10DDI_QUERY_EVENT после того, как среда выполнения выполнила запрос D3D10DDI_QUERY_OCCLUSION.

Если среда выполнения больше не требует объект запроса, среда выполнения освобождает область памяти, ранее выделенную средой выполнения для объекта, и вызывает функцию DestroyQuery(D3D10) драйвера, чтобы уведомить драйвер о том, что драйвер больше не может получить доступ к этой области памяти.