QVulkanInstance Class
QVulkanInstance 클래스는 네이티브 Vulkan 인스턴스를 나타내며, 이를 통해 QSurface 에 Vulkan 렌더링이 가능해집니다. 더 보기...
| 헤더: | #include <QVulkanInstance> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
- 상속된 멤버를 포함한 모든 멤버 목록
- QVulkanInstance는 3D 렌더링의 일부입니다.
공개 타입
| DebugFilter | |
(since 6.5) enum | DebugMessageSeverityFlag { VerboseSeverity, InfoSeverity, WarningSeverity, ErrorSeverity } |
| flags | DebugMessageSeverityFlags |
(since 6.5) enum | DebugMessageTypeFlag { GeneralMessage, ValidationMessage, PerformanceMessage } |
| flags | DebugMessageTypeFlags |
(since 6.5) | DebugUtilsFilter |
| enum | Flag { NoDebugOutputRedirect, NoPortabilityDrivers } |
| flags | Flags |
공개 함수
| QVulkanInstance() | |
| ~QVulkanInstance() | |
| QVersionNumber | apiVersion() const |
(since 6.5) void | clearDebugOutputFilters() |
| bool | create() |
| void | destroy() |
| QVulkanDeviceFunctions * | deviceFunctions(VkDevice device) |
| VkResult | errorCode() const |
| QByteArrayList | extensions() const |
| QVulkanInstance::Flags | flags() const |
| QVulkanFunctions * | functions() const |
| PFN_vkVoidFunction | getInstanceProcAddr(const char *name) |
(since 6.5) void | installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter) |
| void | installDebugOutputFilter(QVulkanInstance::DebugFilter filter) |
| bool | isValid() const |
| QByteArrayList | layers() const |
| void | presentAboutToBeQueued(QWindow *window) |
| void | presentQueued(QWindow *window) |
| void | removeDebugOutputFilter(QVulkanInstance::DebugFilter filter) |
| void | resetDeviceFunctions(VkDevice device) |
| void | setApiVersion(const QVersionNumber &vulkanVersion) |
| void | setExtensions(const QByteArrayList &extensions) |
| void | setFlags(QVulkanInstance::Flags flags) |
| void | setLayers(const QByteArrayList &layers) |
| void | setVkInstance(VkInstance existingVkInstance) |
| QVersionNumber | supportedApiVersion() const |
| QVulkanInfoVector<QVulkanExtension> | supportedExtensions() const |
| QVulkanInfoVector<QVulkanLayer> | supportedLayers() const |
| bool | supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) |
| VkInstance | vkInstance() const |
정적 공용 멤버
| VkSurfaceKHR | surfaceForWindow(QWindow *window) |
상세 설명
Vulkan은 크로스 플랫폼 기반의 명시적 그래픽 및 컴퓨팅 API입니다. 이 클래스는 크로스 플랫폼 방식으로 Vulkan 라이브러리를 로드하고 Vulkan 인스턴스( instance )를 생성할 수 있도록 지원합니다. Vulkan 인스턴스에 대한 소개는 사양서의 3.2절을 참조하십시오.
참고: Vulkan 인스턴스 및 Vulkan을 지원하는 표면을 가진 창에 대한플랫폼별 지원은 다양한 플랫폼 플러그인을 통해 제공됩니다. 그러나 모든 플랫폼이 Vulkan을 지원하는 것은 아닙니다. 이러한 플랫폼에서 실행할 경우, ` create()`는 실패하며 항상 ` false`를 반환합니다.
참고: 빌드 시점에 필요한 Vulkan 헤더를 사용할 수 없는 경우, 특정 Qt 빌드에서Vulkan 지원이 자동으로 비활성화될 수 있습니다. 이러한 상황에서 configure 의 출력 결과가 Vulkan 지원이 비활성화되었음을 나타내면, QVulkan* 클래스를 사용할 수 없게 됩니다.
참고: 일부 함수는 다양한 Vulkan 헤더 개정판 간에 시그니처가 변경되었습니다. Qt를 빌드할 때 시스템에 이전의 충돌하는 시그니처를 가진 헤더만 존재하는 경우, Vulkan 지원이 비활성화됩니다. Vulkan 1.0.39 이상의 헤더를 사용하는 것이 권장됩니다.
초기화
QOpenGLContext 와 마찬가지로, 실제 Vulkan 인스턴스 생성은 create()를 호출할 때만 발생합니다. 이를 통해 QVulkanInstance를 일반 멤버 변수로 사용하면서도 초기화 시점을 제어할 수 있습니다.
지원되는 인스턴스 수준의 레이어와 확장 기능을 조회하려면 supportedLayers() 및 supportedExtensions()를 호출하면 됩니다. 이 함수들은 Vulkan 라이브러리가 로드되었는지 확인하므로, create()보다 먼저 호출해도 안전합니다.
인스턴스는 애플리케이션별 Vulkan 상태를 저장하며, VkInstance 객체를 생성하면 Vulkan 라이브러리가 초기화됩니다. 실제로는 일반적으로 main() 함수의 초반에 단일 인스턴스가 생성됩니다. 이 객체는 애플리케이션이 종료될 때까지 유지됩니다.
모든 Vulkan 기반 ` QWindow `은 ` QWindow::setVulkanInstance()`를 호출하여 `QVulkanInstance`와 연결되어야 합니다. 따라서 일반적인 애플리케이션 패턴은 다음과 같습니다:
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
if (!inst.create())
return 1;
// ...
window->setVulkanInstance(&inst);
window->show();
return app.exec();
}구성
QVulkanInstance는 새로 생성된 인스턴스에서 필요한 최소한의 확장 기능 세트를 자동으로 활성화합니다. 실제로 이는 VK_KHR_*_surface 확장 기능군을 의미합니다.
기본적으로 Vulkan 디버그 출력(예: 유효성 검사 계층에서 발생하는 메시지)은 ` qDebug()`로 전송됩니다. 이는 ` create()`를 호출하기 전에 ` setFlags()`에 ` NoDebugOutputRedirect ` 플래그를 전달하여 비활성화할 수 있습니다.
추가 레이어 및 확장을 활성화하려면, create()를 호출하기 전에 setLayers() 및 setExtensions()를 통해 목록을 제공해야 합니다. 인스턴스에서 특정 레이어나 확장이 사용 가능하다고 보고되지 않는 경우, 해당 요청은 무시됩니다. create() 호출이 성공한 후, layers() 및 extensions()과 같은 함수에서 반환되는 값은 실제로 활성화된 레이어와 확장 기능을 반영합니다. 예를 들어, 충돌하여 Vulkan 인스턴스 생성을 실패하게 할 수 있는 확장 기능을 요청하지 않으려는 경우와 같이 필요한 경우, create()을 호출하기 전에 supportedLayers() 및 supportedExtensions()을 통해 실제로 지원되는 레이어 및 확장 기능 목록을 확인할 수 있습니다.
예를 들어, 표준 유효성 검사 레이어를 활성화하려면 다음과 같이 할 수 있습니다.
QVulkanInstance inst;
// Enable validation layer, if supported. Messages go to qDebug by default.
inst.setLayers({ "VK_LAYER_KHRONOS_validation" });
bool ok = inst.create();
if (!ok) {
// ... Vulkan not available
}
if (!inst.layers().contains("VK_LAYER_KHRONOS_validation")) {
// ... validation layer not available
}또는, Vulkan 인스턴스를 생성하기 전에 미리 결정하려면 다음과 같이 할 수 있습니다:
QVulkanInstance inst;
if (inst.supportedLayers().contains("VK_LAYER_KHRONOS_validation")) {
// ...
}
bool ok = inst.create();
// ...기존 인스턴스 채택
기본적으로 QVulkanInstance는 새로운 Vulkan 인스턴스를 생성합니다. 외부 엔진이나 렌더러와 연동할 때, 이는 바람직하지 않은 경우가 있습니다. 이미 사용 가능한 VkInstance 핸들이 있는 경우, create()를 호출하기 전에 setVkInstance()를 호출하십시오. 이렇게 하면 추가 인스턴스가 생성되지 않으며, QVulkanInstance가 해당 핸들을 소유하지 않게 됩니다.
참고: 외부 인스턴스를 생성하는 컴포넌트는 해당 인스턴스에서 필요한 확장 기능이 활성화되어 있는지 확인해야합니다 . 필요한 확장 기능은 다음과 같습니다. VK_KHR_surface, 해당 플랫폼에 적합한 WSI 전용 VK_KHR_*_surface, 그리고 QVulkanInstance의 디버그 출력 리디렉션이 필요한 경우 VK_EXT_debug_utils 입니다.
코어 Vulkan 명령어에 대한 액세스
QVulkanInstance가 래핑하는 VkInstance 핸들에 접근하려면 vkInstance()를 호출하십시오. Vulkan 함수를 해결하려면 getInstanceProcAddr()를 호출하십시오. 핵심 Vulkan 명령의 경우 functions() 및 deviceFunctions()을 통해 액세스할 수 있는 QVulkanFunctions 및 QVulkanDeviceFunctions 객체를 통해 제공되므로 수동으로 해결할 필요가 없습니다.
참고: QVulkanFunctions 및 QVulkanDeviceFunctions 는 Qt 라이브러리를 빌드할 때 Vulkan API XML 사양에서 생성됩니다. 따라서 이에 대한 별도의 문서는 제공되지 않습니다. 이 파일들에는 Vulkan API 문서에 설명된 것과 동일한 시그니처를 가진 Vulkan 1.2 함수들이 포함되어 있습니다.
창에 대한 네이티브 Vulkan 서피스 가져오기
일반적인 윈도우 시스템별 작업으로는 창에 대한 서피스( VkSurfaceKHR 핸들)를 가져오는 것과, 주어진 큐 패밀리가 특정 서피스에 대한 프레젠테이션을 지원하는지 조회하는 두 가지가 있습니다. 애플리케이션에서 WSI별 세부 사항을 처리하지 않도록 하기 위해, 이러한 작업들은 QVulkanInstance와 그 기반이 되는 QPA 계층에 의해 추상화됩니다.
창에 대한 Vulkan 서페이스를 생성하거나 기존 서페이스를 가져오려면 surfaceForWindow()를 호출합니다. 대부분의 플랫폼은 surfaceForWindow()를 처음 호출할 때만 VK_KHR_*_surface 를 통해 서피스를 생성하지만, 내부 동작에는 플랫폼별 차이가 있을 수 있습니다. 일단 생성되면, 이후 surfaceForWindow() 호출은 동일한 핸들만 반환합니다. 이는 일반적인 Vulkan 지원 QWindow 하위 클래스의 구조와 잘 부합합니다.
물리적 장치 내의 특정 큐 패밀리를 사용하여 지정된 표면에 프레젠테이션을 수행할 수 있는지 조회하려면 supportsPresent()를 호출하십시오. 이 함수는 일반적인 vkGetPhysicalDeviceSurfaceSupportKHR 확인과 WSI 전용 vkGetPhysicalDevice*PresentationSupportKHR 확인을 모두 포함합니다.
문제 해결
create()에서 false 를 반환하거나, surfaceForWindow()에서 0 를 반환하는 것 외에도, 치명적인 오류는 qWarning()을 통해 디버그 출력에 기록됩니다. qt.vulkan 로깅 범주에 대한 디버그 출력을 활성화하여 추가 로깅을 요청할 수 있습니다. 인스턴스 생성 시 발생한 실제 Vulkan 오류 코드는 create() 호출이 실패한 후 errorCode()을 호출하여 확인할 수 있습니다.
일부 특수한 경우에는 Vulkan 라이브러리 이름을 재정의해야 할 수도 있습니다. 이는 QT_VULKAN_LIB 환경 변수를 설정하여 수행할 수 있습니다.
예시
다음은 Vulkan을 지원하는 QWindow 를 생성하는 기본 절차입니다:
class VulkanWindow : public QWindow
{
public:
VulkanWindow() {
setSurfaceType(VulkanSurface);
}
void exposeEvent(QExposeEvent*) {
if (isExposed()) {
if (!m_initialized) {
m_initialized = true;
// 디바이스, 스왑체인 등을 초기화합니다.
QVulkanInstance*inst = vulkanInstance();
QVulkanFunctions*f = inst->functions();
uint32_t devCount = 0;
f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr);
// ...
// 첫 번째 프레임 생성
render();
}
}
}
bool event(QEvent*e) {
if (e->type()== QEvent::UpdateRequest)
render();
return QWindow::event(e);
}
void render() {
// ...
requestUpdate(); // 지속적으로 렌더링
}
private:
bool m_initialized = false;
};
int main(int argc, char**argv)
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
if (!inst.create()) {
qWarning("Vulkan not available");
return 1;
}
VulkanWindow window;
window.showMaximized();
return app.exec();
}참고: 노출(expose)외에도 , 제대로 작동하는 윈도우 구현체는 스왑 체인을 적절히 관리하기 위해 크기 조정(resize) 및 비노출( QPlatformSurfaceEvent )과 같은 추가 이벤트도 처리해야 합니다. 또한, 일부 플랫폼에서는 더 이상 노출되지 않을 때 리소스를 해제해야 할 수도 있습니다.
Vulkan용 C++ 바인딩 사용
Qt의 Vulkan 지원 기능과 C++ Vulkan 래퍼(예: Vulkan-Hpp)를 결합하는 것도 가능합니다. 여기서 전제 조건은 C++ 레이어가 소유권을 인수하지 않고(소유권은 QVulkanInstance와 QWindow 에 남아 있으므로) 클래스 내에서 네이티브 핸들(VkInstance, VkSurfaceKHR)을 채택할 수 있어야 한다는 점입니다. 또한 다음 사항도 고려하십시오:
- 일부 래퍼는 예외 처리가 활성화되어 있어야 합니다. Qt는 예외를 사용하지 않습니다. 애플리케이션에서 예외 처리를 활성화하려면 `
.pro` 파일에 `CONFIG += exceptions`를 추가하십시오. - 일부 래퍼는
vulkan.h가 프로토타입을 제공하고, 애플리케이션이 필요한 모든 심볼을 내보내는 Vulkan 라이브러리에 링크되어 있다고 가정하여 Vulkan 함수를 직접 호출합니다. Qt는 Vulkan 라이브러리에 직접 링크되지 않을 수 있습니다. 따라서 일부 플랫폼에서는 애플리케이션의.pro파일에LIBS += -lvulkan또는 이와 유사한 내용을 추가해야 할 수도 있습니다. - QVulkan 클래스의 헤더 파일에는
VK_NO_PROTOTYPES가 활성화된vulkan.h가 포함될 수 있습니다. 이로 인해 프로토타입에 의존하는 C++ 래퍼 헤더에서 문제가 발생할 수 있습니다. 따라서 애플리케이션 코드에서는 QVulkan 헤더를 포함하기 전에vulkan.hpp또는 이와 유사한 헤더를 포함해야 할 수 있습니다.
보안 고려 사항
Vulkan 구현체(즉, Vulkan 로더, 드라이버 및 활성화된 모든 레이어)는 신뢰할 수 있는 인-프로세스 플랫폼 종속성입니다. Qt는 OpenGL 구현체를 처리하는 것과 동일한 방식으로, 샌드박싱이나 검증 절차 없이 이를 로드하고 직접 호출합니다.
QVulkanInstance 및 이를 기반으로 하는 클래스(예: QVulkanWindow 및 Vulkan 백엔드를 사용하는 QRhi )가 처리하는 모든 데이터는 신뢰할 수 있는 콘텐츠로 간주됩니다. 여기에는 setLayers() 및 setExtensions()에 전달되는 레이어 및 확장명, setVkInstance()를 통해 채택된 네이티브 VkInstance 핸들, 그리고 애플리케이션에서 생성된 모든 렌더링 콘텐츠 및 Vulkan 명령 매개변수가 포함됩니다.
경고: 애플리케이션 개발자는 애플리케이션의 일부가 아니며 개발자의 통제 범위를 벗어난 사용자 제공 콘텐츠의 투입을 허용하기 전에, 그로 인해 발생할 수 있는 잠재적 영향을 신중하게 고려해야 합니다.
QVulkanFunctions 및 QSurface::SurfaceType도 참조하십시오 .
멤버 유형 문서
QVulkanInstance::DebugFilter
디버그 필터링 콜백 함수에 대한 typedef로, 시그니처는 다음과 같습니다.
bool myDebugFilter(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object,
size_t location, int32_t messageCode, const char *pLayerPrefix, const char *pMessage)true 를 반환하면 메시지 출력이 억제됩니다.
참고: Qt 6.5부터 더 이상 사용되지 않는 ` VK_EXT_debug_report` 대신 ` VK_EXT_debug_utils `가 사용됩니다. 이 콜백 시그니처는 `VK_EXT_debug_report`를 기반으로 합니다. 따라서 모든 인자가 유효하다고 가정할 수는 없습니다. pMessage, messageCode, object 이외의 인자에 의존하지 마십시오. VK_EXT_debug_utils에 명시된 모든 콜백 데이터에 접근하려는 애플리케이션은 DebugUtilsFilter 으로 전환해야 합니다.
installDebugOutputFilter() 및 removeDebugOutputFilter()도 참조하십시오 .
[since 6.5] enum QVulkanInstance::DebugMessageSeverityFlag
flags QVulkanInstance::DebugMessageSeverityFlags
| 상수 | 상수 |
|---|---|
QVulkanInstance::VerboseSeverity | 0x01 |
QVulkanInstance::InfoSeverity | 0x02 |
QVulkanInstance::WarningSeverity | 0x04 |
QVulkanInstance::ErrorSeverity | 0x08 |
이 열거형은 Qt 6.5에서 도입되었습니다.
DebugMessageSeverityFlags 유형은 QFlags<DebugMessageSeverityFlag>에 대한 typedef입니다. 이 유형은 DebugMessageSeverityFlag 값들의 OR 조합을 저장합니다.
[since 6.5] enum QVulkanInstance::DebugMessageTypeFlag
flags QVulkanInstance::DebugMessageTypeFlags
| 상수 | 상수 |
|---|---|
QVulkanInstance::GeneralMessage | 0x01 |
QVulkanInstance::ValidationMessage | 0x02 |
QVulkanInstance::PerformanceMessage | 0x04 |
이 열거형은 Qt 6.5에서 도입되었습니다.
DebugMessageTypeFlags 유형은 QFlags<DebugMessageTypeFlag>에 대한 typedef입니다. 이 유형은 DebugMessageTypeFlag 값들의 OR 조합을 저장합니다.
[alias, since 6.5] QVulkanInstance::DebugUtilsFilter
디버그 필터링 콜백 함수를 위한 typedef로, 시그니처는 다음과 같습니다.
std::function<bool(DebugMessageSeverityFlags severity, DebugMessageTypeFlags type, const void *message)>;message 인자는 VkDebugUtilsMessengerCallbackDataEXT 구조체에 대한 포인터입니다. 자세한 내용은 VK_EXT_debug_utils 문서를 참조하십시오. Qt 헤더 파일은 1.0 이후 버전의 Vulkan 헤더에 대한 의존성을 피하기 위해 실제 타입을 사용하지 않습니다.
true 를 반환하면 메시지 출력이 억제됩니다.
이 typedef는 Qt 6.5에서 도입되었습니다.
installDebugOutputFilter() 및 removeDebugOutputFilter()도 참조하십시오 .
enum QVulkanInstance::Flag
flags QVulkanInstance::Flags
이 열거형은 ` setFlags()`에 전달할 수 있는 플래그를 정의합니다. 이 플래그들은 ` create()`의 동작을 제어합니다.
| 상수 | 값 | 설명 |
|---|---|---|
QVulkanInstance::NoDebugOutputRedirect | 0x01 | Vulkan 디버그 출력(VK_EXT_debug_utils)이 qDebug 로 리디렉션되는 것을 비활성화합니다. |
QVulkanInstance::NoPortabilityDrivers (since Qt 6.5) | 0x02 | Vulkan Portability로 표시된 물리적 장치의 열거를 비활성화합니다. |
Flags 유형은 QFlags<Flag>에 대한 typedef입니다. 이 유형은 Flag 값들의 OR 조합을 저장합니다.
멤버 함수 문서
QVulkanInstance::QVulkanInstance()
새로운 인스턴스를 생성합니다.
참고: 생성자에서는 Vulkan 초기화가 수행되지않습니다 .
[noexcept] QVulkanInstance::~QVulkanInstance()
소멸자.
참고: 인스턴스가 소멸되면 `vkInstance()`는 ` nullptr `을 반환합니다.
QVersionNumber QVulkanInstance::apiVersion() const
애플리케이션이 실행될 것으로 예상하는 요청된 Vulkan API 버전을 반환하거나, create() 호출 전에 setApiVersion()이 호출되지 않은 경우 null 버전 번호를 반환합니다.
setApiVersion()도 참조하십시오 .
[since 6.5] void QVulkanInstance::clearDebugOutputFilters()
installDebugOutputFilter() 함수를 통해 이전에 설치된 모든 필터 함수를 제거합니다.
참고: 이 함수는 create() 호출 전에 호출할 수 있습니다.
이 함수는 Qt 6.5에서 도입되었습니다.
installDebugOutputFilter()도 참조하십시오 .
bool QVulkanInstance::create()
Vulkan 라이브러리를 초기화하고, 새로운 Vulkan 인스턴스를 생성하거나 기존 인스턴스를 채택합니다.
성공하면 true를 반환하고, 오류가 발생하거나 Vulkan이 지원되지 않을 경우 false를 반환합니다.
성공 시, vkInstance()를 통해 이 QVulkanInstance 에 대한 포인터를 가져올 수 있습니다.
이 ` QVulkanInstance `가 존재하는 동안, 또는 ` destroy()`가 호출될 때까지 Vulkan 인스턴스와 라이브러리를 사용할 수 있습니다.
기본적으로 VkInstance는 VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 플래그가 설정된 상태로 생성됩니다. 이는 Vulkan Portability 물리 장치도 함께 열거됨을 의미합니다. 이를 원하지 않는 경우, NoPortabilityDrivers 플래그를 설정하십시오.
void QVulkanInstance::destroy()
기본 플랫폼 인스턴스를 삭제하며, 이에 따라 VkInstance도 삭제됩니다(소유 중인 경우). QVulkanInstance 객체는 create()을 다시 호출하여 재사용할 수 있습니다.
QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
장치 수준의 핵심 Vulkan 명령어 세트를 노출하며, 크로스 플랫폼에서 정상 작동이 보장되는 QVulkanDeviceFunctions 객체를 반환합니다.
참고: 반환된 객체의 Vulkan함수는 첫 번째 매개변수로 device 또는 device 의 자식 객체(VkQueue, VkCommandBuffer)만을 사용하여 호출해야 합니다. 이는 내부 디스패싱으로 인한 잠재적인 오버헤드를 피하기 위해 이러한 함수가 vkGetDeviceProcAddr을 통해 해결되기 때문입니다.
참고: 반환된객체는 QVulkanInstance 가 소유하고 관리합니다. 이 객체를 파괴하거나 변경해서는 안 됩니다.
참고: 객체는 캐시되므로 동일한 device 를 사용하여 이 함수를 다시 호출하는 것은 비용이 거의 들지 않는 작업입니다. 그러나 디바이스가 소멸될 경우, resetDeviceFunctions()를 호출하여 QVulkanInstance 에 이를 알리는 것은 애플리케이션의 책임입니다.
Vulkan 1.0 핵심 API의 함수들은 항상 사용할 수 있습니다. 1.1 및 1.2와 같은 더 높은 버전의 Vulkan의 경우, QVulkanDeviceFunctions 객체는 해당 버전에 대한 핵심 API 함수도 해결하려고 시도하지만, 실행 시점에 Vulkan 물리 장치가 이를 지원하지 않는다면, 지원되지 않는 함수를 호출하면 정의되지 않은 동작이 발생할 수 있습니다. Vulkan 1.0보다 높은 버전에 대한 지원을 올바르게 활성화하려면, create()를 호출하기 전에 setApiVersion()를 호출하여 적절한 인스턴스 API 버전을 설정해야 할 수 있습니다. 또한, 애플리케이션은 VkPhysicalDeviceProperties에서 물리적 장치의 apiVersion 를 확인해야 합니다.
functions() 및 resetDeviceFunctions()도 참조하십시오 .
VkResult QVulkanInstance::errorCode() const
create() 호출이 실패한 경우 Vulkan 오류 코드를 반환하며, 그렇지 않은 경우 VK_SUCCESS 를 반환합니다.
이 값은 일반적으로 vkCreateInstance()의 반환값입니다(기존 인스턴스를 채택하는 대신 새로운 Vulkan 인스턴스를 생성하는 경우). 단, 플랫폼 플러그인이 Vulkan을 지원하지 않는 경우에는 VK_NOT_READY 가 반환될 수도 있습니다.
QByteArrayList QVulkanInstance::extensions() const
create()가 호출되어 성공적으로 완료된 경우, 활성화된 인스턴스 확장 기능을 반환합니다. 그렇지 않은 경우 요청된 확장 기능을 반환합니다.
setExtensions()도 참조하십시오 .
QVulkanInstance::Flags QVulkanInstance::flags() const
요청된 플래그를 반환합니다.
setFlags()도 참조하십시오 .
QVulkanFunctions *QVulkanInstance::functions() const
디바이스 수준 함수를 제외한 핵심 Vulkan 명령어 세트를 노출하며, 크로스 플랫폼에서 정상 작동이 보장되는 해당 ` QVulkanFunctions ` 객체를 반환합니다.
참고: 반환된객체는 QVulkanInstance 가 소유하고 관리합니다. 이 객체를 파기하거나 변경하지 마십시오.
Vulkan 1.0 핵심 API의 함수는 항상 사용할 수 있습니다. 1.1 및 1.2와 같은 더 높은 버전의 Vulkan의 경우, ` QVulkanFunctions ` 객체는 해당 버전에 대한 핵심 API 함수도 해결하려고 시도하지만, 런타임 시 Vulkan 인스턴스 구현이 이를 지원하지 않는다면, 지원되지 않는 함수를 호출하면 정의되지 않은 동작이 발생합니다. 또한, 1.0보다 높은 버전의 Vulkan에 대한 지원을 올바르게 활성화하려면, ` create()`를 호출하기 전에 ` setApiVersion()`를 호출하여 적절한 인스턴스 API 버전을 설정해야 할 수도 있습니다. Vulkan 구현의 인스턴스 수준 버전을 조회하려면 ` supportedApiVersion()`를 호출하십시오.
deviceFunctions() 및 supportedApiVersion()도 참조하십시오 .
PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(const char *name)
지정된 name 를 사용하여 Vulkan 함수를 해결합니다.
핵심 Vulkan 명령어의 경우, 대신 functions() 및 deviceFunctions()에서 제공되는 함수 래퍼를 사용하는 것이 좋습니다.
[since 6.5] void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)
모든 Vulkan 디버그 메시지가 발생할 때마다 호출되는 filter 함수를 등록합니다. 콜백이 true 를 반환하면 해당 메시지는 차단(필터링)되어 디버그 출력에 표시되지 않습니다.
참고: 필터링은 NoDebugOutputRedirect 가 set 가 아닐 때만 유효합니다. 그렇지 않은 경우 필터를 등록해도 아무런 효과가 없습니다.
참고: 이 함수는 create() 호출 전에 호출할 수 있습니다.
이 함수는 Qt 6.5에서 도입되었습니다.
clearDebugOutputFilters()도 참조하십시오 .
void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugFilter filter)
모든 Vulkan 디버그 메시지가 발생할 때마다 호출되는 ` filter ` 함수를 등록합니다. 콜백이 ` true`를 반환하면 해당 메시지는 차단(필터링)되어 디버그 출력에 표시되지 않습니다.
참고: 필터링은 NoDebugOutputRedirect 가 set 가 아닐 때만 유효합니다. 그렇지 않은 경우 필터를 등록해도 아무런 효과가 없습니다.
참고: 이 함수는 create() 호출 전에 호출할 수 있습니다.
이 함수는 오버로드된 함수입니다.
removeDebugOutputFilter()도 참조하십시오 .
bool QVulkanInstance::isValid() const
create() 호출이 성공했고 인스턴스가 유효한 경우 true를 반환합니다.
QByteArrayList QVulkanInstance::layers() const
create()가 호출되어 성공적으로 완료된 경우, 활성화된 인스턴스 레이어를 반환합니다. 그렇지 않은 경우 요청된 레이어를 반환합니다.
setLayers()도 참조하십시오 .
void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
이 함수는 애플리케이션의 렌더러가 window 에 대한 프리젠트 작업을 큐에 넣기 전에 호출해야 합니다.
일부 플랫폼에서는 이 함수가 아무런 작업도 수행하지 않지만, 일부 플랫폼에서는 윈도우 시스템에 따라 동기화 작업을 수행할 수 있습니다. 예를 들어, Wayland에서는 드라이버가 최소화된 창으로 인해 차단되는 것을 방지하기 위해 wl_surface.frame 요청을 전송합니다.
void QVulkanInstance::presentQueued(QWindow *window)
이 함수는 애플리케이션의 렌더러가 window 에 대한 프리젠트 작업을 큐에 넣은 후에 호출해야 합니다.
일부 플랫폼에서는 이 함수가 아무런 작업도 수행하지 않지만, 일부 플랫폼에서는 윈도우 시스템에 따라 동기화 작업을 수행할 수도 있습니다. 예를 들어, X11 환경에서는 이 함수가 ` _NET_WM_SYNC_REQUEST_COUNTER`를 업데이트합니다.
void QVulkanInstance::removeDebugOutputFilter(QVulkanInstance::DebugFilter filter)
installDebugOutputFilter() 함수를 통해 이전에 설치된 ‘ filter ’ 함수를 제거합니다.
참고: 이 함수는 create() 호출 전에 호출할 수 있습니다.
installDebugOutputFilter()도 참조하십시오 .
void QVulkanInstance::resetDeviceFunctions(VkDevice device)
지정된 device 에 대한 QVulkanDeviceFunctions 객체를 무효화하고 파괴합니다.
deviceFunctions()가 호출된 VkDevice가 소멸될 때, 애플리케이션이 계속 실행될 예정이며 추후 새로운 논리적 Vulkan 장치를 생성할 가능성이 있는 경우 이 함수를 호출해야 합니다.
QVulkanInstance 를 소멸시키기 전에 이 함수를 호출할 필요는 없으며, 이 경우 정리 작업이 자동으로 수행됩니다.
deviceFunctions()도 참조하십시오 .
void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)
애플리케이션이 사용하도록 설계된 Vulkan API의 최고 버전을 지정합니다.
기본적으로 ` vulkanVersion `의 값은 0이며, 이는 Vulkan 1.0에 해당합니다.
참고: 이 함수는 create() 호출 전에만 호출할 수 있으며, 그 이후에 호출하면 아무런 효과가 없습니다.
참고: Vulkan 1.1에서는 Vulkan API 버전 필드와 관련된 동작이 변경되었음을유의하십시오 . Vulkan 1.0에서는 사양에 따라 지원되지 않는 vulkanVersion 를 지정하면 create()이 VK_ERROR_INCOMPATIBLE_DRIVER 오류와 함께 실패했습니다. Vulkan 1.1부터 사양에서는 이를 허용하지 않으며, 드라이버는 인스턴스 생성을 실패시키지 않고 모든 버전을 수용해야 합니다.
애플리케이션 개발자는 Vulkan 사양서의 apiVersion 관련 설명을 숙지할 것을 권장합니다.
apiVersion() 및 supportedApiVersion()도 참조하십시오 .
void QVulkanInstance::setExtensions(const QByteArrayList &extensions)
활성화할 추가 인스턴스 extensions 목록을 지정합니다. 지원되지 않는 확장 기능을 지정해도 안전합니다. 실행 시 지원되지 않는 경우 해당 항목은 무시되기 때문입니다.
참고: Qt에서 요구하는 서피스 관련확장 (예: VK_KHR_win32_surface)은 항상 자동으로 추가되므로, 이 목록에 포함할 필요가 없습니다.
참고: NoPortabilityDrivers 플래그가 설정되어 있지 않은 한VK_KHR_portability_enumeration 는 자동으로 추가됩니다. 이 값은 Qt 6.5에서 도입되었습니다.
참고: 이 함수는 create() 호출 전에만 호출할 수 있으며, 그 이후에 호출하면 아무런 효과가 없습니다.
extensions()도 참조하십시오 .
void QVulkanInstance::setFlags(QVulkanInstance::Flags flags)
flags 에 따라 create()의 동작을 설정합니다.
참고: 이 함수는 create() 호출 전에만 호출할 수 있으며, 그 이후에 호출하면 아무런 효과가 없습니다.
flags()도 참조하십시오 .
void QVulkanInstance::setLayers(const QByteArrayList &layers)
활성화할 인스턴스 layers 목록을 지정합니다. 지원되지 않는 레이어를 지정해도 안전합니다. 실행 시 지원되지 않는 레이어는 무시되기 때문입니다.
참고: 이 함수는 create() 호출 전에만 호출할 수 있으며, 그 이후에 호출하면 아무런 효과가 없습니다.
layers()도 참조하십시오 .
void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
QVulkanInstance 가 새로운 VkInstance 핸들을 생성하는 대신 기존 핸들을 사용하도록 합니다.
참고: ` existingVkInstance ` 에는 최소한 ` VK_KHR_surface `와 해당 WSI 전용 ` VK_KHR_*_surface ` 확장이 활성화되어 있어야 합니다. 디버그 출력 리디렉션이 제대로 작동하도록 하려면 ` VK_EXT_debug_utils `도 필요합니다.
Qt는 이미 생성된 VkInstance에서 레이어와 확장을 활성화할 수 있는 방법이 없습니다. 따라서 existingVkInstance 가 Qt와 함께 사용하기에 적합한지 확인하는 것은 호출자의 책임입니다. QRhi 기반 렌더링이 포함된 경우, QRhiVulkanInitParams::preferredInstanceExtensions()를 호출하여 위에서 언급한 확장 기능 외에도 existingVkInstance 의 생성자가 활성화해야 할 추가 인스턴스 확장 기능 목록을 조회하십시오. 단, 이러한 확장 기능은 런타임 시 시스템에서 사용 가능하고 지원되어야 합니다.
참고: 이 함수는 create() 호출 전에만 호출할 수 있으며, 그 이후에 호출하면 아무런 효과가 없습니다.
참조: vkInstance().
QVersionNumber QVulkanInstance::supportedApiVersion() const
Vulkan 구현체에서 지원하는 인스턴스 수준 기능의 버전을 반환합니다.
실제로는 해당 함수가 사용 가능한 경우(Vulkan 1.1 이상) vkEnumerateInstanceVersion에서 반환된 값이 되거나, 그렇지 않은 경우 1.0이 반환됩니다.
실행 시점에 사용 가능한 Vulkan 버전에 따라 Vulkan 기능 및 API 사용을 분기 처리하려는 애플리케이션은, 이 함수를 사용하여 create()을 호출하기 전에 setApiVersion()에 전달할 버전을 결정할 수 있습니다.
참고: 이 함수는 create() 호출 전에 호출할 수 있습니다.
setApiVersion()도 참조하십시오 .
QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions() const
지원되는 인스턴스 수준 확장 기능의 목록을 반환합니다.
참고: 이 함수는 ` create()` 호출 전에 호출할 수 있습니다.
QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers() const
지원되는 인스턴스 수준 레이어 목록을 반환합니다.
참고: 이 함수는 ` create()` 호출 전에 호출할 수 있습니다.
bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
physicalDevice 내의 queueFamilyIndex 를 가진 큐 패밀리가 window 로의 프레젠테이션을 지원하는 경우 true를 반환합니다.
프레젠테이션 수행에 사용할 수 있는 큐를 결정하기 위해, 주어진 Vulkan 장치의 큐를 검사할 때 이 함수를 호출하십시오.
[static] VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
지정된 window 에 대한 VkSurfaceKHR 핸들을 생성하거나 이미 존재하는 경우 이를 가져옵니다.
Vulkan 표면 핸들을 반환하며, 실패 시 0을 반환합니다.
VkInstance QVulkanInstance::vkInstance() const
QVulkanInstance 가 래핑하는 VkInstance 핸들을 반환하거나, create()가 아직 성공적으로 호출되지 않았고 setVkInstance()를 통해 기존 인스턴스가 제공되지 않은 경우에는 nullptr 를 반환합니다.
setVkInstance()도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.