sebbbi/NoGraphicsAPI

Minimal graphics API. Built on top of latest Vulkan extensions. As close as possibly to my "No Graphics API" blog post and the SIGGRAPH talk.

무엇을 해결하는가

NoGraphicsAPI는 기존 그래픽 API의 복잡성을 단순화하는 실험적인 구현체입니다. 버퍼 객체, 디스크립터 세트 및 복잡한 파이프라인 레이아웃을 관리하는 과도한 오버헤드를 직접적인 GPU 메모리 주소 지정 및 단순화된 동기화로 대체하는 설계를 탐구합니다.

작동 방식

Vulkan 1.4를 기반으로 구축된 이 프로젝트는 VkDescriptorSetVkPipelineLayout과 같은 전통적인 API 추상화를 제거합니다. 대신 다음을 사용합니다:

  • GPU 포인터: 셰이더는 64비트 GPU 포인터를 사용하여 메모리에서 정점과 데이터를 직접 가져오며, 이는 전통적인 버퍼 바인딩을 대체합니다.
  • 애플리케이션 소유 힙(Application-Owned Heaps): 애플리케이션은 텍스처 및 샘플러를 위한 자체 디스크립터 힙을 관리하며, 공유 루트 페이로드를 통해 셰이더에 인덱스를 전달합니다.
  • 단순화된 동기화: 리소스별 전환 목록 대신 전역 스테이지 및 액세스 장벽을 사용하여 실행 및 메모리 해저드를 설명합니다.
  • 공유 루트 ABI: 각 드로우(draw) 또는 디스패치(dispatch) 호출 시 필수적인 포인터와 값을 제공하기 위해 작고 공유된 C++/Slang 구조체가 GPU로 직접 복사됩니다.

대상 사용자

이 프로젝트는 저수준 GPU 아키텍처, 실험적인 API 설계에 관심이 있는 그래픽 프로그래머 및 엔진 개발자, 그리고 Vulkan을 사용하여 그래픽 프로그래밍에 대한 "포인터 기반" 접근 방식을 탐구하고자 하는 사람들을 위한 것입니다.

주요 특징

  • 보일러플레이트 제거: 디스크립터 풀, 레이아웃 및 샘플러 객체의 필요성을 제거합니다.
  • 직접 메모리 액세스: VK_EXT_descriptor_heapVK_KHR_device_address_commands를 활용하여 가공되지 않은 GPU 주소 기반 작업을 수행합니다.
  • Slang 통합: Slang 셰이더 언어를 사용하여 CPU와 GPU 데이터 구조 간의 깔끔한 계약을 구현합니다.
  • 하드웨어 검증 완료: 다양한 최신 NVIDIA 및 AMD GPU(RDNA 3+, Turing+)에서 테스트되었습니다.

관련

  • 프로젝트
  • 프로젝트
  • 프로젝트
  • 프로젝트