Directx 12 Constant Buffer View in a UWP application skeleton.

Anonymous
2020-05-07T04:30:42.887+00:00
void Sample3DSceneRenderer::CreateDeviceDependentResources()
{
    auto d3dDevice = m_deviceResources->GetD3DDevice();

    // Create a root signature with a single constant buffer slot.
    {
        CD3DX12_DESCRIPTOR_RANGE range;
        CD3DX12_ROOT_PARAMETER parameter;

        range.Init(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, 1, 0);
        parameter.InitAsDescriptorTable(1, &range, D3D12_SHADER_VISIBILITY_VERTEX);

        D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags =
            D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | // Only the input assembler stage needs access to the constant buffer.
            D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_PIXEL_SHADER_ROOT_ACCESS;

        CD3DX12_ROOT_SIGNATURE_DESC descRootSignature;
        descRootSignature.Init(1, &parameter, 0, nullptr, rootSignatureFlags);

        ComPtr<ID3DBlob> pSignature;
        ComPtr<ID3DBlob> pError;
        DX::ThrowIfFailed(D3D12SerializeRootSignature(&descRootSignature, D3D_ROOT_SIGNATURE_VERSION_1, pSignature.GetAddressOf(), pError.GetAddressOf()));
        DX::ThrowIfFailed(d3dDevice->CreateRootSignature(0, pSignature->GetBufferPointer(), pSignature->GetBufferSize(), IID_PPV_ARGS(&m_rootSignature)));
        NAME_D3D12_OBJECT(m_rootSignature);
    }

Based off what I know about DirectX12 and the skeleton app I have read through it leads me to make some presumptions.

  • That CD3DX12_ROOT_PARAMETER parameter is being used as a descriptor table and range is where the "stuff" to be contained will be located.
  • That the constant buffer should only be visible to the vertex shader as per "D3D12_SHADER_VISIBILITY_VERTEX"
  • That a constant buffer view will exist bound to "shaderResourceSlot0"

I am now lead to wonder what the constant buffer will actually contain or how it will be filled with "stuff"

In the SampleVertexShader.hlsl it contains this snippet:

// A constant buffer that stores the three basic column-major matrices for composing geometry.
cbuffer ModelViewProjectionConstantBuffer : register(b0)
{
    matrix model;
    matrix view;
    matrix projection;
};

I was curious if "b0" is the shaderResourceSlot0" as the range parameter combination is set to (or if b0 and shaderResourceSlot0 are the same). Also the constant buffer was initialized to a size of 1 but here in HLSL I see a cbuffer that contains three matrixes. Is it possible I could get some explanation as to how these things relate to each other and also how a size 1 constant buffer might contain three matrixes?

Thank You!

Universal Windows Platform (UWP)
{count} votes

1 answer

Sort by: Most helpful
  1. Anonymous
    2020-05-22T02:49:49.323+00:00

    OK. Setting up a constant buffer view and root signature. That's what I am getting right now with a D3D12_SHADER_VISIBILITY_VERTEX visibility level with a descriptor table. That's about what I was able to understand at this point and that there are packing rules.

    0 comments No comments