3d游戏引擎的direct12的DirectHelpers.h实现

1.D3D12Helpers.h

#pragma once
#include "D3D12CommonHeaders.h"


namespace primal::graphics::d3d12::d3dx{

    constexpr struct {
        const D3D12_HEAP_PROPERTIES default_heap
        {
            /*
            D3D12_HEAP_TYPE            Type;
            D3D12_CPU_PAGE_PROPERTY        CPUPageProperty;
            D3D12_MEMORY_POOL        MemoryPoolPreference;
            UINT    CreationNodeMask;
            UINT    VisibleNodeMask;

            */
                D3D12_HEAP_TYPE_DEFAULT,
                D3D12_CPU_PAGE_PROPERTY_UNKNOWN,
                D3D12_MEMORY_POOL_UNKNOWN,
                0,
                0
        };
    
    
    
    
    }heap_properties;

    ID3D12RootSignature* create_root_signature(const D3D12_ROOT_SIGNATURE_DESC1& desc);

    struct d3d12_descriptor_range : public D3D12_DESCRIPTOR_RANGE1 
    {
    
        constexpr explicit d3d12_descriptor_range(D3D12_DESCRIPTOR_RANGE_TYPE range_type,
            u32 descriptor_count, u32 shader_register, u32 space = 0,
            D3D12_DESCRIPTOR_RANGE_FLAGS flags = D3D12_DESCRIPTOR_RANGE_FLAG_NONE,
            u32 offset_from_table_start = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND)
            : D3D12_DESCRIPTOR_RANGE1{ range_type,descriptor_count,shader_register,space,flags,offset_from_table_start }
        {

        }
    
    
    
    
    };


    struct d3d12_root_parameter : public D3D12_ROOT_PARAMETER1 
    {
        constexpr void as_constants(u32 num_constants, D3D12_SHADER_VISIBILITY visibility,
            u32 shader_register, u32 space = 0) {
        
            ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS;
            ShaderVisibility = visibility;
            Constants.Num32BitValues = num_constants;
            Constants.ShaderRegister = shader_register;
            Constants.RegisterSpace = space;
        
        
        
        }

        constexpr void as_cbv(D3D12_SHADER_VISIBILITY visibility,
            u32 shader_register, u32 space = 0,
            D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) {
        
            as_descriptor(D3D12_ROOT_PARAMETER_TYPE_CBV, visibility, shader_register, space, flags);
        
        
        }
    
        constexpr void as_srv(D3D12_SHADER_VISIBILITY visibility,
            u32 shader_register, u32 space = 0,
            D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) {

            as_descriptor(D3D12_ROOT_PARAMETER_TYPE_SRV, visibility, shader_register, space, flags);


        }
        constexpr void as_uav(D3D12_SHADER_VISIBILITY visibility,
            u32 shader_register, u32 space = 0,
            D3D12_ROOT_DESCRIPTOR_FLAGS flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE) {


            as_descriptor(D3D12_ROOT_PARAMETER_TYPE_UAV, visibility, shader_register, space, flags);

        }

        constexpr void as_descriptor_table(D3D12_SHADER_VISIBILITY visibility,
            d3d12_descriptor_range* ranges, u32 range_count)
        {
            ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
            ShaderVisibility = visibility;
            DescriptorTable.NumDescriptorRanges = range_count;
            DescriptorTable.pDescriptorRanges = ranges;
                

        }

    private:
        constexpr void as_descriptor(D3D12_ROOT_PARAMETER_TYPE type, D3D12_SHADER_VISIBILITY visibility,
            u32 shader_register, u32 space, D3D12_ROOT_DESCRIPTOR_FLAGS flags) {
            
            ParameterType = type;
            ShaderVisibility = visibility;
            Descriptor.ShaderRegister = shader_register;
            Descriptor.RegisterSpace = space;
            Descriptor.Flags = flags;
            
        
        
        }
    
    
    
    };
    
    struct d3d12_root_signature_desc : public D3D12_ROOT_SIGNATURE_DESC1 {
        constexpr explicit d3d12_root_signature_desc(const d3d12_root_parameter* parameters,
            u32 parameter_count,
            const D3D12_STATIC_SAMPLER_DESC* static_samplers = nullptr,
            u32 sampler_count = 0, D3D12_ROOT_SIGNATURE_FLAGS flags =
            D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_AMPLIFICATION_SHADER_ROOT_ACCESS |
            D3D12_ROOT_SIGNATURE_FLAG_DENY_MESH_SHADER_ROOT_ACCESS) 
            : D3D12_ROOT_SIGNATURE_DESC1{parameter_count,parameters,sampler_count,static_samplers,flags}
        
        {


        }


        ID3D12RootSignature* create() const 
        {
        
            return create_root_signature(*this);
        
        
        
        }


    };

}
2.D3D12Heplers.cpp

#include "D3D12Helpers.h"
#include "D3D12Core.h"


namespace primal::graphics::d3d12::d3dx {

    namespace {
    
        
    
    
    
    }

    ID3D12RootSignature*
        create_root_signature(const D3D12_ROOT_SIGNATURE_DESC1& desc) 
    {
        
        D3D12_VERSIONED_ROOT_SIGNATURE_DESC versioned_desc{};
        versioned_desc.Version = D3D_ROOT_SIGNATURE_VERSION_1_1;
        versioned_desc.Desc_1_1 = desc;

        using namespace Microsoft::WRL;
        ComPtr<ID3DBlob> signature_blob{ nullptr };
        ComPtr<ID3DBlob> error_blob{ nullptr };
        HRESULT hr{ S_OK };
        if (FAILED(D3D12SerializeVersionedRootSignature(&versioned_desc, &signature_blob, &error_blob)))
        {
            DEBUG_OP(const char* error_msg{ error_blob ? (const char*)error_blob->GetBufferPointer() : "" });
            DEBUG_OP(OutputDebugStringA(error_msg));
            return nullptr;
        }


    
        ID3D12RootSignature* signature{ nullptr };
        DXCall(hr = core::device()->CreateRootSignature(0, signature_blob->GetBufferPointer(), signature_blob->GetBufferSize(), IID_PPV_ARGS(&signature)));

        return signature;
    
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Magnum Lehar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值