рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ 12 - рд▓рд┐рдпреЛрдирд╛рд░реНрдбреЛ рджрд╛ рд╡рд┐рдВрд╕реА рд╕реЗ рд╕рдордХрд╛рд▓реАрди рдХрд▓рд╛ рддрдХ

рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдФрд░ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдЕрдиреБрд╢рд╛рд╕рди рд╣реИред рд╣рд░ рд╕рд╛рд▓, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ 3 рдбреА рдореЙрдбрд▓рд┐рдВрдЧ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреИрдХреЗрдЬ рдХреЗ рд╕реНрддрд░ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреА рд╣реИрдВред рдпрд╣ рд╕рдм рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдЫрд╡рд┐


DirectX 12 рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдПрдХ рдШрдЯрдХ рд╣реИред рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕реАрдкреАрдпреВ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рдирд╛, рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ, рдПрдкреАрдЖрдИ рд╕реНрддрд░ рдкрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ (рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рд╡реЗрдВрдбрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░реЙрд╕рдлрд╝рд╛рдпрд░рдПрдХреНрд╕, рдПрдирд╡реАрдЖрдИрдбреАрдЖрдИ рдПрд╕рдПрд▓рдЖрдИ рд╕рдорд╛рдзрд╛рди рдереЗ)ред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ Microsoft рджреНрд╡рд╛рд░рд╛ рдЬреБрд▓рд╛рдИ 2015 рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред


рдЖрд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧреНрд░рд╛рдлрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ (рдУрдкрдирдЬреАрдПрд▓, рдбрд╛рдпрд░реЗрдХреНрдЯрдПрдХреНрд╕ 11) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреЛ рд▓реЛрдЧ 12 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:


  • рд╡рд╛рддрд╛рд╡рд░рдг
  • рдЧреНрд░рд╛рдлрд┐рдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг
  • рдирдИ DirectX 12 рд╕реБрд╡рд┐рдзрд╛рдПрдБ
    1. рд░рд╛рдЬреНрдп рдЕрдореЗрд░рд┐рдХрд╛
    2. рдЯреАрдореЗрдВ
    3. рддрд╛рджрд╛рддреНрдореНрдп
    4. рд╕рдВрд╕рд╛рдзрди рд╕рдВрд▓рдЧреНрдирдХ

рд╡рд╛рддрд╛рд╡рд░рдг


DirectX 12 Windows SDK Windows 10. IDE Visual Studio, C++. DirectX, d3d12.h dxgi1_6.h d3d12.lib, dxguid.lib, dxgi.lib, d3dcompiler.lib. Windows SDK. "D3D12 Helper Library" d3dx12.h, boilerplate . d3dx12.h .



, тАФ - . , тАФ . , . . , , . , тАФ , .


, .



, , , , , , . тАФ . , . , , , , . . тАФ (clip space).



тАФ , . . , . , . . ( ). API. , , .



, , , , . .



, (scissor test), (stencil test) (depth test). , . - , . , , . , .


DirectX 11 ( DiretcX 12 )


DirectX 12


DirectX 12.



11 : RSSetState(), OMSetDepthStencilState(), OMSetBlendState(). , . , . , тАФ PSO (Pipeline State Object). : " ", . , , Root Signature ( ).



immideate context. . , DirectX 11 deferred context. DirectX 12 immideate context deferred . deferred command list, .


, : command list, , CPU .


, . , GPU, . , Release() тАФ , .



GPU, DirectX 12 fence, ID3D12Fence . Fence тАФ , GPU . ┬л┬╗ , ID3D12CommandQueue::Signal() . ID3D12Fence::SetEventOnCompletion(UINT64 Value, HANDLE hEvent) winapi event. WaitForSingleObject() event- , . GPU , fence , WaitForSingleObject() .



тАФ DirectX.



DirectX 11 : API. , ( ) 5 6 :


ID3D11ShaderResourceView* srvs[] = { 
    texture1->GetShaderResourceView();
    texture2->GetShaderResourceView();
};
context->PSSetShaderResources(5, 2, srvs);

GetShaderResourceView() ID3D11ShaderResourceView.
:


Texture2D texture1 : register(t5);
Texture2D texture2 : register(t6);

, . , . ? GCN ISA, :


All vector memory operations use an image resource constant (T#) that is a 128- or 256-bit value in SGPRs. This constant is sent to the texture cache when the instruction is executed. This constant defines the address, data format, and characteristics of the surface in memory.

, , (128 256-), . , , . , , ┬л┬╗ . : (T#), (S#) (V#). Direct3D 12 , , тАФ GPU.



, . тАФ , (GPU , , , , ). тАФ . :


  • Constant buffer views (CBVs)
  • Unordered access views (UAVs)
  • Shader resource views (SRVs)
  • Samplers

CBVs, UAVs, SRVs , тАФ . , .


shader visible . , non shader visible :


  • Render Target Views (RTVs)
  • Depth Stencil Views (DSVs)
  • Stream Output Views (SOVs)

views ( ), non shader visible ( D3D12_DESCRIPTOR_HEAP_FLAGS::D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE ).


view's, (, , ) :


  • Index Buffer View (IBV)
  • Vertex Buffer View (VBV)

D3D12_INDEX_BUFFER_VIEW D3D12_VERTEX_BUFFER_VIEW . Pipeline State Object. PSO .


, ID3D11...View, .


Root signature


Root signature тАФ DirectX 12 API . , , . Root signature , () , .


Root signature , root parameter. root parameter root arguments. root argument, . Root parameter :


  • Root constants (1 DWORD == 32bit value)
  • Inline descriptors ( 64-bit GPU virtual addresses, 2 DWORDs )
  • (1 DWORD)

root signature тАФ 64 DWORDs. , .


Root constant root signature 32- , constant buffer. (, MVP ), ( 4 ). , . : " ".


root signature тАФ inline descriptors. тАФ per object. , . . ( ), GPU. , , ID3D12GraphicsCommandList::SetGraphicsRootConstantBufferView, root parameter inline descriptor .


, . descriptor range. Descriptor range тАФ . :


typedef enum D3D12_DESCRIPTOR_RANGE_TYPE
    {
        D3D12_DESCRIPTOR_RANGE_TYPE_SRV = 0,
        D3D12_DESCRIPTOR_RANGE_TYPE_UAV = ( D3D12_DESCRIPTOR_RANGE_TYPE_SRV + 1 ) ,
        D3D12_DESCRIPTOR_RANGE_TYPE_CBV = ( D3D12_DESCRIPTOR_RANGE_TYPE_UAV + 1 ) ,
        D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER = ( D3D12_DESCRIPTOR_RANGE_TYPE_CBV + 1 ) 
    }   D3D12_DESCRIPTOR_RANGE_TYPE;

typedef struct D3D12_DESCRIPTOR_RANGE
    {
    D3D12_DESCRIPTOR_RANGE_TYPE RangeType;
    UINT NumDescriptors;
    UINT BaseShaderRegister;
//...
    }   D3D12_DESCRIPTOR_RANGE;

, RangeType тАФ , NumDescriptors тАФ , BaseShaderRegister тАФ . . ID3D12GraphicsCommandList::SetGraphicsRootDescriptorTable, root parameter . , , . , descriptor heap.



рд╣рдордиреЗ DirectX 12 рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдпрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред


рд▓рд┐рдВрдХ:
https://docs.microsoft.com/en-us/windows/win32/direct3d12/directx-12-programming-guide
https://developer.nvidia.com/dx12-dos-and-donts
https: //e gpuopen.com/performance-root-signature-descriptor-sets/


All Articles