D-Vulkan

6710 단어 Vulkandlang
D언어로 Vulkan하는 건에 대해.
htps : // 기주 b. 코 m / 오 s t 루에 / ヵ 온 D



원래는 D로 DirectX 할 생각이었지만,
Vulkan의 기계가 익었기 때문에 시도했습니다.

하나 전에 썼다.
Vulkan 소개
의 C++를 베타로 D언어로 이식한 것입니다.

D-Vulkan
사용했다.

환경은 Windows10의 DMD + dub + VisualD.
64bit 빌드는 링크가 여러가지 끼우므로 32bit 빌드에 타협.

D-Vulkan의 코드 생성



바인딩을 손수 만든 것이라고 생각하면, 아무래도 파이썬으로 코드 생성하고 있다.
추적하면 khronos의 공식 API가 xml로 관리되고 있고, 거기에서 파이썬으로 C의 헤더와 문서를 출력하는 시스템이 있었다.
  • htps //w w. kh의 s. rg/레기 스트리/ㄔㄷ/s페cs/1.0/레기 스트리. HTML # _ 오 t t t_ 게네라와 r_sc 리 pt_s 팡_c ぁ s_ 물건 s
  • htps : // 기주 b. 코 m / Kh 여우의 sG 왁스 p / ヵ 돈도 cs

  • D-Vulkan은 이것을 기반으로 D 언어 바인딩의 출력 스크립트를 만들고 있었다.
    dvulkan> python.exe vkdgen.py ../Vulkan-Docs/src/spec source/dvulkan 
    

    그러면 types.d와 function.d가 업데이트됩니다.
    dvulkan에 손을 넣을 때는 vkdgen.py에 손을 넣으면 좋다.

    D-Vulkan 조금 개조



    C의 콜백에 extern(C)를 붙이는 것과, 최신의 xml를 사용하면 익스텐션이 늘어나므로 그것을 막는 처치 등.
    htps : // 기주 b. 코 m / 오 s t 루에 / d ヵ

    Win32Surface 바인딩


    alias PFN_vkCreateWin32SurfaceKHR
            = extern(C) VkResult function(VkInstance instance,
                    const(VkWin32SurfaceCreateInfoKHR)* pCreateInfo
                        , const(VkAllocationCallbacks)* pAllocator
                            ,VkSurfaceKHR* pSurface);
    PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
    
    auto p=vkGetInstanceProcAddr(inst.get(), "vkCreateWin32SurfaceKHR");
    vkCreateWin32SurfaceKHR = cast(PFN_vkCreateWin32SurfaceKHR) p;
    
    struct VkWin32SurfaceCreateInfoKHR
    {
        VkStructureType sType = VkStructureType.VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
        const(void)* pNext;
        VkFlags flags;
        HINSTANCE hinstance;
        HWND hwnd;
    };
    

    vkdgen.py의 제외 익스텐션에서 Win32Surface를 제거하는 손도 있었지만, 모듈이 플랫폼 고유의 형태로 오염되기 때문에 배송. 앱 측에서 수동 정의했다.

    D-Vulkan 사용상의 주의


    VkInstance inst;
    VkResult res = vkCreateInstance(&inst_info, null, &inst);
    if (res != VK_SUCCESS) {
        return null;
    }
    loadInstanceFunctions(inst); // <- これ
    

    vkCreateInstance하면 loadInstanceFunctions를 호출하지 않으면 대부분의 함수가 호출할 수 있는 상태가 되지 않는다.
    호출하지 않으면 null 함수 포인터를 호출하여 AccessViolation이 나오고 머리를 비틀게 되기 때문에 주의.
    그 외는, C버전과 대체로 같기 때문에 D 고유의 주의점은 없다.



    오랜만에 D를 재개했지만, C++의 코드를 D에 이식하는 것이 너무 즐거워서 깜짝 놀랐다.
    마치 std::shared_ptr과 std::vector와 std::string이 내포된 C++와 같은 사용하기 편하다.
    자신의 C++ 스타일에 굉장히 맞는 느낌으로 정말 편안합니다.
    C의 API에 대해 포인터를 건네줄 때 &struct, array.ptr, string.ptr로 하는 것만으로 되어 버리므로 알기 쉽다.
    C#의 DllImport에 비해 꽤 편하게 사용할 수 있다.
    local의 class 변수에 scope를 붙이면, struct로 하지 않아도 수명이 gc 관리가 아닌 scope 아웃까지 할 수 있는 것도 좋다.
    scope auto uniform_buffer=new BufferResource(device);
    

    개발 환경에는 VisualD를 사용했다.
    VisualD의 솔루션은 dub에서 생성할 수 있다.
    > dub generate visuald
    

    브레이크 포인트를 두고 스텝 실행할 수 있으므로 충분히 사용할 수 있다.
    괄호 속에서 개행했을 때 등 들여쓰기가 조금 기모이 경우가 있다든가, 실행시에 에러가 발생하면 사망할 때가 있는 등 아직 개발판인 느낌이 들지만 사용해 간다.

    CG 방면에서 D언어는 유망하다고 생각하기 때문에 시험해 보려고 하고 있다.

    좋은 웹페이지 즐겨찾기