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의 헤더와 문서를 출력하는 시스템이 있었다.
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언어는 유망하다고 생각하기 때문에 시험해 보려고 하고 있다.
Reference
이 문제에 관하여(D-Vulkan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ousttrue/items/2b7da994a466e1fa1f84
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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언어는 유망하다고 생각하기 때문에 시험해 보려고 하고 있다.
Reference
이 문제에 관하여(D-Vulkan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ousttrue/items/2b7da994a466e1fa1f84
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
VkInstance inst;
VkResult res = vkCreateInstance(&inst_info, null, &inst);
if (res != VK_SUCCESS) {
return null;
}
loadInstanceFunctions(inst); // <- これ
오랜만에 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언어는 유망하다고 생각하기 때문에 시험해 보려고 하고 있다.
Reference
이 문제에 관하여(D-Vulkan), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ousttrue/items/2b7da994a466e1fa1f84텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)