directx
TRANSCRIPT
#msdevcon
Windows & More Personal Computing
Как работает DirectX 12Дмитрий АндреевЭксперт по стратегическим технологиям, Microsoft
• Разработано API и рабочие драйвера • Около 70% игроков имеют совместимое с DirectX 12
оборудование• 33.5% уже установили Windows 10
• 1 год для бесплатного апгрейда до Windows 10 для Windows 7 и 8.x
Готовность DirectX 12
* базируется на Steam survey
Direct3D 12 API• Повышение эффективности• Снижение нагрузки на CPU• Увеличение масштабируемости для нескольких ядер
CPU• Улучшение качества контроля состояния• Включение возможностей D3D11
ID3D11DeviceContext
Рендер-контекст D3D11
Input Assembler
Vertex Shader
Hull Shader
Tessellator
Rasterizer
Domain Shader
Geometry Shader
Pixel Shader
Output Merger
GPU Memory
Другие состяния
Direct3D 12 – оптимизация состояния конвейера
Группировка конвейера в единый объект
Копирование PSO в состояние оборудования
HW State 1
HW State 2
PipelineState
ObjectHW State 3
ID3D11DeviceContext
Рендер-контекст D3D11
Input Assembler
Vertex Shader
Hull Shader
Tessellator
Rasterizer
Domain Shader
Geometry Shader
Pixel Shader
Output Merger
GPU Memory
Non-PSO State
Рендер-контекст D3D12 : Pipeline State Object (PSO)
Pipeline State ObjectInput Assembler
Vertex Shader
Hull Shader
Tessellator
Rasterizer
Domain Shader
Geometry Shader
Pixel Shader
Output Merger
GPU Memory
Non-PSO State
Direct3D 12: Дескрипторные кучи и дескрипторные таблицы• Масштабирование возможностей оборудования• Универсальный подход по связыванию ресурсов• Повторное использование статической привязки
• Динамическая индексация шейдерных ресурсов
Дескриптор• Небольшой пакет данных описывающий параметры ресурса• Просто данные – не управляются драйверами/ОС
Descriptor { Type Format Mip Count pData }
Texture
Дескрипторная куча• Место хранения дескрипторов• Структура определяется
приложением• Низкий уровень затрат на
манипуляции• Допустимо создание
множества куч
GPU Memory
Desc
ripto
r Hea
p
Дескрипторные таблицы• Контекст указывает на активную кучу• Не является объектом API• Один тип представления на таблицу
Pipeline State Object…
Vertex Shader
…
Pixel Shader
…
Start IndexSize
Render Context: Дескрипторные кучи и дескрипторные таблицы
Pipeline State ObjectInput Assembler
Vertex Shader
Hull Shader
Tessellator
Rasterizer
Domain Shader
Geometry Shader
Pixel Shader
Output Merger
GPU Memory
Non-PSO State
Дескрипторные таблицы - HLSLTexture2D texA[8] : register(t3, 2);Texture2D texB[8] : register(t2, 4);
SamplerState sam[2] : register(s0, 1);
struct MyCBufferType{ float foo; float bar;};
cbuffer MyCBufferType buf[4] : register(c0, 2);
Дескрипторные таблицы - HLSLfloat4 main( uint i1 : INDEX1, uint i2 : INDEX2, float2 coord : TEXCOORD) : SV_TARGET{ MyCBufferType b = buf[i1]; // CBuffer table 2 element #(i1) SamplerState s = sam[i1]; // Sampler table 1 element #(i1) Texture2D tA = texA[i1]; // SRV table 2 element #(i1+3) Texture2D tB = texB[i2]; // SRV table 4 element #(i2+2) float4 colorA = tA.Sample(s, coord); float4 colorB = tB.Sample(s, coord); return colorA * b.foo + colorB * b.bar;}
DirectX Graphics samples• https://github.com/Microsoft/DirectX-Graphics-Samples
Root Signature
Очереди команд и списки команд
Command Queue
Execute Command List 1Execute Command List 2Signal Fence
Command List 1ClearSetTableExecute Bundle ASetTableDrawSetPSODraw
Command List 2ClearDispatchSetTableExecute Bundle ASetTableExecute Bundle B
SetP
SODraw
SetP
SOSe
tTable
Dispatc
h
SetP
SOSe
tTable
DrawSe
tPSO
Draw
Перегрузка CPU : Повторяющиеся команды рендера• Типичное приложение посылает идентичные пакеты команд от
фрейма к фрейму• 90-95% для типичного современного приложения
Бандл• Небольшой список команд• Единожды записанный• Может быть использован
множество раз Context
ClearDrawSetTableExecute BundleSetTableExecute BundleSetPSO…
SetP
SODraw
SetP
SOSe
tTable
Dispatc
h
SetP
SOSe
tTable
DrawSe
tPSO
Draw
Пример без бандлов// Setup
pContext->SetPipelineState(pPSO);
pContext->SetRenderTargetViewTable(0, 1, FALSE, 0);
pContext->SetVertexBufferTable(0, 1);
pContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Draw 1
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
// Draw 2
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
Set object #1 specific tables and draw
Setup pipeline state and common descriptor tables
Set object #2 specific tables and draw
Создание бандла// Create bundle
pDevice->CreateCommandList(D3D12_COMMAND_LIST_TYPE_BUNDLE, pBundleAllocator, pPSO, pDescriptorHeap, &pBundle);
// Record commands
pBundle->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
pBundle->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pBundle->DrawInstanced(6, 1, 0, 0);
pBundle->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pBundle->DrawInstanced(6, 1, 6, 0);
pBundle->Close();
С бандлами// Setup
pContext->SetPipelineState(pPSO);
pContext->SetRenderTargetViewTable(0, 1, FALSE, 0);
pContext->SetVertexBufferTable(0, 1);
pContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
// Draw 1
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
// Draw 2
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->DrawInstanced(6, 1, 0, 0);
pContext->SetShaderResourceViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->DrawInstanced(6, 1, 6, 0);
// Setup
pContext->SetRenderTargetViewTable(0, 1, FALSE, 0);
pContext->SetVertexBufferTable(0, 1);
// Draw 1 and 2
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 0, 1);
pContext->ExecuteBundle(pBundle);
pContext->SetConstantBufferViewTable(D3D12_SHADER_STAGE_PIXEL, 1, 1);
pContext->ExecuteBundle(pBundle);
Без
Лимиты ресурсов DX11• https://msdn.microsoft.com/en-us/library/windows/desktop/ff47690
0(v=vs.85).aspx• D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION 2048 array slices• Up to 128 resources can be active for each pipeline stage.
D3D11 ПрофайлингPresentApp Logic D3D11 UMD KMDDXGK
App Logic D3D11
App Logic D3D11
App Logic D3D11
Thread 0
Thread 1
Thread 2
Thread 3
0 ms 2.50 ms 5.00 ms 7.50 ms
App Logic D3D Runtime User-mode Driver DXGKernel Kernel-mode Driver Present
D3D12 Профайлинг
App Logic UMDD3D
12 Pres
entDX
GK/
KMD
App Logic UMDD3D
12App Logic UMDD3
D12
App Logic UMDD3D
12
Thread 0
Thread 1
Thread 2
Thread 3
0 ms 2.50 ms 5.00 ms 7.50 ms
App Logic D3D Runtime User-mode Driver DXGKernel Kernel-mode Driver Present
D3D11 v D3D12 результаты
App Logic UMDD3 D1 2 Pr es en tDXG
K/ KM D
App Logic UMDD3 D1 2
App Logic UMDD3 D1 2
App Logic UMDD3 D1 2
Thread 0
Thread 1
Thread 2
Thread 3
0 ms 2.50 ms 5.00 ms 7.50 ms
PresentApp Logic D3D11 UMD KMDDXGK
App Logic D 3 D 1 1
App Logic D 3 D 1 1
App Logic D 3 D 1 1
Thread 0
Thread 1
Thread 2
Thread 3
0 ms 2.50 ms 5.00 ms 7.50 ms
App+GFX (ms) GFX-only (ms)
D3D11 D3D12 D3D11 D3D12
Thread 0 7.88 3.80 5.73 1.17
Thread 1 3.08 2.50 0.35 0.81
Thread 2 2.84 2.46 0.34 0.69
Thread 3 2.63 2.45 0.23 0.65
Total 16.42 11.21 6.65 3.32
Мультиадаптерность
Копирование ресурсов с помощью Multiengine
• Синхронизация между GPUs• Разделяемая общая память
…dGPU3D->Draw(frame1A)dGPU3D->Signal(renderComplete)
dGPUCopy->Wait(renderComplete)dGPUCopy->Copy(frame1A, sharedHeap)dGPUCopy->Signal(copyComplete)
iGPU3D->Wait(copyComplete)iGPU3D->Bind(sharedFrame)iGPU3D->Draw(frame1B)iGPU3D->Present(frame1B)…
Visual Studio Graphics Analyzer
Инструменты анализа графики: последнее поколение
PIX для Xbox 360
CPU, GPU, системный профайлинг и отладка для Xbox консоли
Инструменты анализа графики: последнее поколение
PIX для Xbox 360
Popular unified CPU, GPU, System profiling and debugging tool for Xbox console
PIX для Windows
DirectX SDK инструмент для отладки графики
Инструменты анализа графики: последнее поколение
PIX для Xbox 360
Popular unified CPU, GPU, System profiling and debugging tool for Xbox console
PIX для Windows
DirectX SDK graphics tool focused on graphics debugging
Visual Studio 2012
Visual Studio Graphics Diagnostics 2012:интегрированный в Visual Studio инструмент базирующийся на PIX
• Графики в реальном масштабе времени• Visual Studio Graphics
Analyzer (VSGA)• Специальный
инструмент для анализа фреймов
• Создан с использованием Visual Studio shell
Улучшенный инструмент анализа и диагностики
•Просмотр исходного кода шейдера и результатов компиляции в ассемблер
•Редактирование кода и мгновенный просмотр результатов
Редактирование шейдеров
Анализ нагрузки на GPU• Графики в реальном масштабе
времени: frame time, frame rate, GPU utilization
• Удобно для поиска «бутылочных горлышек» при работе GPU/CPU
• Легкий инструмент для записи и проигрывания фреймов приложения directx • Полный анализ в
VS
Инструмент командной строки для записи фреймов
• Graphics Tools• Visual Studio Community Edition:
http://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs• http://blogs.msdn.com/b/vcblog/
• DirectX 12• Блог: http://blogs.msdn.com/b/directx/• Документация : https://msdn.microsoft.com/en-us/library/dn903821(v=vs.85).aspx
• GDC 2015:• http://channel9.msdn.com/Events/GDC/GDC-2015/Advanced-DirectX12-Graphics-and-Performance• http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/D3D12-A-new-meaning-for-efficienc
y-and-performance.ppsx• DirectX Tools:
http://channel9.msdn.com/Events/GDC/GDC-2015/Solve-the-Tough-Graphics-Problems-with-your-Game-Using-DirectX-Tools
• Direct3D 12 Power & Performance: http://channel9.msdn.com/Events/GDC/GDC-2015/Better-Power-Better-Performance-Your-Game-on-DirectX12
• Microsoft DirectX 12 and Graphics Education • https://github.com/Microsoft/DirectX-Graphics-Samples.git
Ресурсы
© 2016 Microsoft Corporation. All rights reserved.