Vulkan 물리 장치 속성

2022. 9. 25. 15:31Vulkan/특별편

개요

물리 장치 속성과 역량 중에서 장치 생성은 시작 시 그래픽카드(내장 그래픽) 선택에 참고할 뿐 아니라, 선택 시 저장해 둘 만한 값이 응용에 따라 달리 있을 겁니다. 이번 글은 그것을 판단하는 데 도움이 되기 위해 간결히 모아 두는 것입니다.

 

주의) 확장 기능(e.g. 끝에 2나 EXT, KHR 같은 게 붙은 것들)은 내용이 어려워져서 여기선 다루지 않습니다. 물론 확장이 아닌 것도 쉽지 않은 내용이 있어 정보가 부족할 수 있습니다.

 

목차

1. 우리의 선택권

2. vkGetPhysicalDeviceFeatures

3. vkGetPhysicalDeviceMemoryProperties

4. vkGetPhysicalDeviceProperties

  4.1. 역량(limits)

5. 나머지

 

본문

1. 우리의 선택권

지금 쓸 수 있는 속성 물리 장치 조사 관련 내용은 아래 접은글에 나와 있습니다. (확장과 무관한 내용은 색 음영을 주었습니다.)

더보기
vkGetPhysicalDeviceCalibrateableTimeDomainsEXT.html
vkGetPhysicalDeviceCooperativeMatrixPropertiesNV.html
vkGetPhysicalDeviceDirectFBPresentationSupportEXT.html
vkGetPhysicalDeviceDisplayPlaneProperties2KHR.html
vkGetPhysicalDeviceDisplayPlanePropertiesKHR.html
vkGetPhysicalDeviceDisplayProperties2KHR.html
vkGetPhysicalDeviceDisplayPropertiesKHR.html
vkGetPhysicalDeviceExternalBufferProperties.html // 1.1버전
vkGetPhysicalDeviceExternalBufferPropertiesKHR.html
vkGetPhysicalDeviceExternalFenceProperties.html
vkGetPhysicalDeviceExternalFencePropertiesKHR.html
vkGetPhysicalDeviceExternalImageFormatPropertiesNV.html
vkGetPhysicalDeviceExternalSemaphoreProperties.html // 1.1버전
vkGetPhysicalDeviceExternalSemaphorePropertiesKHR.html
vkGetPhysicalDeviceFeatures.html
vkGetPhysicalDeviceFeatures2.html // 1.1버전
vkGetPhysicalDeviceFeatures2KHR.html
vkGetPhysicalDeviceFormatProperties.html
vkGetPhysicalDeviceFormatProperties2.html
vkGetPhysicalDeviceFormatProperties2KHR.html
vkGetPhysicalDeviceFragmentShadingRatesKHR.html
vkGetPhysicalDeviceImageFormatProperties.html
vkGetPhysicalDeviceImageFormatProperties2.html
vkGetPhysicalDeviceImageFormatProperties2KHR.html
vkGetPhysicalDeviceMemoryProperties.html
vkGetPhysicalDeviceMemoryProperties2.html // 1.1버전
vkGetPhysicalDeviceMemoryProperties2KHR.html
vkGetPhysicalDeviceMultisamplePropertiesEXT.html
vkGetPhysicalDevicePresentRectanglesKHR.html
vkGetPhysicalDeviceProperties.html
vkGetPhysicalDeviceProperties2.html // 1.1버전
vkGetPhysicalDeviceProperties2KHR.html
vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR.html
vkGetPhysicalDeviceQueueFamilyProperties.html
vkGetPhysicalDeviceQueueFamilyProperties2.html // 1.1버전
vkGetPhysicalDeviceQueueFamilyProperties2KHR.html
vkGetPhysicalDeviceScreenPresentationSupportQNX.html
vkGetPhysicalDeviceSparseImageFormatProperties.html
vkGetPhysicalDeviceSparseImageFormatProperties2.html // 1.1버전
vkGetPhysicalDeviceSparseImageFormatProperties2KHR.html
vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV.html
vkGetPhysicalDeviceSurfaceCapabilities2EXT.html
vkGetPhysicalDeviceSurfaceCapabilities2KHR.html
vkGetPhysicalDeviceSurfaceCapabilitiesKHR.html
vkGetPhysicalDeviceSurfaceFormats2KHR.html
vkGetPhysicalDeviceSurfaceFormatsKHR.html
vkGetPhysicalDeviceSurfacePresentModes2EXT.html
vkGetPhysicalDeviceSurfacePresentModesKHR.html
vkGetPhysicalDeviceSurfaceSupportKHR.html
vkGetPhysicalDeviceToolProperties.html // 1.3버전
vkGetPhysicalDeviceToolPropertiesEXT.html
vkGetPhysicalDeviceVideoCapabilitiesKHR.html
vkGetPhysicalDeviceVideoFormatPropertiesKHR.html
vkGetPhysicalDeviceWaylandPresentationSupportKHR.html
vkGetPhysicalDeviceWin32PresentationSupportKHR.html
vkGetPhysicalDeviceXcbPresentationSupportKHR.html
vkGetPhysicalDeviceXlibPresentationSupportKHR.html

 

2. vkGetPhysicalDeviceFeatures

vkGetPhysicalDeviceFeatures에서는 VkPhysicalDeviceFeatures를 얻을 수 있습니다. 속성을 확인해 보고 흥미 있는 것들을 정리해 봅시다. 등장 순서는 구조체 내 위치 기준입니다.

 

VkPhysicalDeviceFeatures의 모든 멤버는 32비트 정수형이지만 0이냐 아니냐만 판단하면 됩니다.

멤버 이름 설명
robustBufferAccess 버퍼 기술자에 명시된 범위를 기준으로 접근에 경계 검사를 합니다.
fullDrawIndexUint32 인덱스 버퍼를 이용한 렌더링을 할 때 32비트 비부호형 정수 인덱스(VK_INDEX_TYPE_UINT32)를 사용할 시 2^32-1까지의 인덱스를 사용할 수 있습니다. 사용하지 못하는 경우라도 Vulkan이 가능한 장치에서는 2^24-1까지는 사용할 수 있다고 합니다. 자세한 내용은 limits에서 다룹니다.
imageCubeArray VK_IMAGE_VIEW_TYPE_CUBE_ARRAY 타입의 이미지 뷰를 사용할 수 있습니다.
independentBlend VkPipelineColorBlendAttachmentState 옵션을 첨부물마다 달리 줄 수 있습니다.
geometryShader 지오메트리 셰이더를 사용할 수 있습니다.
tessellationShader 테셀레이션 셰이더(control, evaluation)를 사용할 수 있습니다.
sampleRateShading  샘플 셰이딩과 멀티샘플 보간을 사용할 수 있습니다.
dualSrcBlend 블렌딩에서 2개 소스를 사용하는 VK_BLEND_FACTOR_SRC1_COLORVK_BLEND_FACTOR_ONE_MINUS_SRC1_COLORVK_BLEND_FACTOR_SRC1_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA를 사용할 수 있습니다.
logicOp 파이프라인 생성 시 색 블렌딩에서 논리 연산을 사용할 수 있습니다.
multiDrawIndirect 다중 간접 그리기를 쓸 수 있습니다. 최대 수는 limits의 maxDrawIndirectCount에서 확인합니다. 간접 그리기는 장치 버퍼에서 매개변수를 읽습니다.
drawIndirectFirstInstance 간접 그리기 명령 인수에 시작할 인스턴스 번호를 0 이외의 값으로 정할 수 있습니다.
depthClamp 파이프라인 생성 시 깊이 자르기가 가능하게 설정할 수 있습니다.
depthBiasClamp 파이프라인 생성 시 혹은 동적 상태로 깊이 바이어스를 줄 수 있습니다.
fillModeNonSolid 꼭짓점만 표시 / 모서리만 표시(와이어프레임) 모드가 지원됩니다.
depthBounds 깊이 경계 테스트가 가능합니다.
wideLines 1.0외의 두께의 선분 표시가 가능합니다.
largePoints 1.0외의 크기의 점 표시가 가능합니다.
alphaToOne 여러 샘플 커버하는 조각 동작의 출력의 알파 값을 바꿀 수 있습니다.
multiViewport 여러 개의 뷰포트를 사용할 수 있습니다.
samplerAnisotropy 샘플러에서 비등방성 필터링을 사용할 수 있습니다.
textureCompressionETC2 ETC2, EAC 압축 텍스처 형식을 사용할 수 있습니다.
textureCompressionASTC_LDR ASTC LDR 압축 텍스처 형식을 사용할 수 있습니다.
textureCompressionBC BC 압축 텍스처 형식을 사용할 수 있습니다.
occlusionQueryPrecise 샘플 수를 리턴하는 가림 질의를 할 수 있습니다.
pipelineStatisticsQuery 파이프라인 통계(정점셰이더 실행수 등..) 질의를 지원합니다.
vertexPipelineStoresAndAtomics 정점/테셀레이션/지오메트리 셰이더에서 저장소 버퍼나 이미지가 저장과 불가분 연산을 지원합니다.
fragmentStoresAndAtomics 조각 셰이더에서 저장소 버퍼나 이미지가 저장과 불가분 연산을 지원합니다.
shaderTessellationAndGeometryPointSize 테셀레이션 제어/계산, 지오메트리 셰이더에서 PointSize 데코레이션을 사용할 수 있습니다.
shaderImageGatherExtended 이미지 수집 명령(OpImage*Gather)을 사용할 수 있습니다.
shaderStorageImageExtendedFormats 저장소 이미지 확장 형식이 모두 지원됩니다.
shaderStorageImageMultisample 멀티샘플 저장소 이미지를 사용할 수 있습니다. 
shaderStorageImageReadWithoutFormat 저장소 이미지를 읽을 때 형식 지정자를 꼭 넣을 필요가 없는 경우를 허용합니다.
shaderStorageImageWriteWithoutFormat 저장소 이미지를 쓸 때 형식 지정자를 꼭 넣을 필요가 없는 경우를 허용합니다.
shaderUniformBufferArrayDynamicIndexing 공유(uniform) 버퍼 배열이 셰이더 코드에서 동적으로 통일된(참고) 정수 표현식 인덱스로 접근될 수 있습니다. (문서 설명에 따르면 이게 FALSE인 경우 정적 통일 코드 역시 안 되고 자체가 상수여야만 가능하다는 것 같습니다.)
shaderSampledImageArrayDynamicIndexing 샘플러 혹은 샘플된 이미지의 배열이 동적으로 통일된 정수 표현식 인덱스로 접근될 수 있습니다.
shaderStorageBufferArrayDynamicIndexing 저장소 버퍼 배열이 동적으로 통일된 정수 표현식 인덱스로 접근될 수 있습니다.
shaderStorageImageArrayDynamicIndexing 저장소 이미지 배열이 동적으로 통일된 정수 표현식 인덱스로 접근될 수 있습니다.
shaderClipDistance 클립 거리를 셰이더 코드에서 사용할 수 있습니다.
shaderCullDistance 컬 거리를 셰이더 코드에서 사용할 수 있습니다.
shaderFloat64 64비트 부동소수점 값을 셰이더 코드에서 사용할 수 있습니다.
shaderInt16 16비트 정수 값을 셰이더 코드에서 사용할 수 있습니다.
shaderResourceResidency 셰이더 코드에서 리소스 상주 정보를 리턴하는 이미지 동작을 사용할 수 있습니다.
shaderResourceMinLod 셰이더 코드에서 최소 자원 LOD를 명시할 수 있습니다.
sparseBinding 자원 메모리가 객체 단위가 아닌 불투명한 희소 블록 수준에서 관리될 수 있습니다. 부분 바인드와 부분 상주는 사양을 참고하세요.
sparseResidencyBuffer 장치가 부분 상주 버퍼에 접근할 수 있습니다. 부분 상주는 
sparseResidencyImage2D 장치가 부분 상주 2D 이미지(1픽셀 1샘플)에 접근할 수 있습니다.
sparseResidencyImage3D 장치가 부분 상주 3D 이미지에 접근할 수 있습니다.
sparseResidency2Samples
sparseResidency4Samples
sparseResidency8Samples
sparseResidency16Samples
장치가 부분 상주 2D 이미지(1픽셀 2/4/8/16샘플)에 접근할 수 있습니다.
sparseResidencyAliased 장치가 여러 위치에 얼라이어스된 데이터에 올바르게 접근할 수 있습니다.
variableMultisampleRate 첨부물이 없는 서브패스 진행 중에 바인드되는 모든 파이프라인에서 래스터화 샘플 수를 통일하지 않아도 됩니다.
inheritedQueries 질의가 활성화되어 있을 때 보조 명령 버퍼를 사용할 수 있습니다.

 

초보자 입장으로 치면 특별히 눈여겨볼 만한 기능은 전체 중 소수에 불과합니다. 제가 표시하지 않은 것들은 대부분 정말로 최대한 많은 장치에서 기능을 차별화해서라도 지원하고 싶을 때 사용하는 게 되겠지 싶네요.

 

3. vkGetPhysicalDeviceMemoryProperties

2편에서 본 것만 알면 될 겁니다.

이 함수에서 얻은 구조체에서 memoryTypes 배열의 i번 원소는 장치의 i형 메모리 타입이 어떤 속성(CPU에서 매핑 가능, 매핑 시 캐싱 or 지속적 동기화, GPU에서 사용하기 가장 좋음)을 가졌는지 확인할 수 있습니다.

 

한편 버퍼/이미지 메모리의 requirement를 얻는 함수에서 얻는 값은 이 i에 대한 비트마스크로 오른쪽부터 i번 비트가 1인 경우 i형 메모리를 사용할 수 있다는 뜻입니다.

 

같은 구조체에 있는데 사용하지를 않았던 MemoryHeap에 대하여 잠시 짚고 넘어가자면, 메모리를 할당할 수 있는 힙 그 자체에 대한 것으로 그 크기에 대한 정보가 1.0버전 기준으로는 사실상 전부입니다. MemoryType의 heapIndex가 가리키는 번호는 그 유형의 메모리가 할당될 힙, 즉 MemoryHeaps의 인덱스입니다.

 

4. vkGetPhysicalDeviceProperties

여기서는 장치 이름, 제조사 등을 조사할 수 있습니다.

 

deviceType(통합 GPU(단일 그래픽카드), 이산 GPU(호스트에 인터링크로 연결된 별도의 프로세서), 가상화된 GPU 자원, CPU 중 어떤 것인지 확인 가능)을 조사해서 CPU라면 다른 그래픽스 API를 시도하여 Vulkan을 지원하지 않는 그래픽 카드가 그 다른 건 지원하는지 확인해 볼 수도 있고, 장치의 역량을 직접적으로 확인해 볼 수도 있습니다.

 

4.1. 역량(limits)

위 함수에서 얻은 구조체의 limits 멤버를 확인하여 중요한 내용을 이것저것 알아볼 수 있습니다. 여기는 스펙에서 보장되는 limits를 찾기 귀찮을 때 확인하기 좋습니다.

멤버 이름 설명(멤버 타입) 비고
maxImageDimension1D
maxImageDimension2D
maxImageDimension3D
maxImageDimensionCube
이미지 크기 제한(픽셀)입니다.(u32) 1/2D/Cube는 최소 4096 보장, 3D는 최소 256 보장
maxImageArrayLayers 이미지 배열 길이 제한입니다.(u32) 최소 256 보장
maxTexelBufferElements 텍셀 버퍼에서 찾을 수 있는 최대 텍셀 수입니다.(u32) 최소 65536 보장
maxUniformBufferRange 동적 공유 버퍼의 range(원소 하나당 크기)의 최대값입니다.(u32) 최소 16384 보장
maxStorageBufferRange 동적 저장소 버퍼의 range의 최대값입니다. (u32) 최소 2^27 보장
maxPushConstantSize 푸시 상수 버퍼의 크기의 최대값입니다. (u32) 최소 128 보장
maxMemoryAllocationCount 메모리를 할당할 수 있는 최대 개수입니다. (u32) 최소 4096 보장
maxSamplerAllocationCount 샘플러 객체를 생성할 수 있는 최대 개수입니다. (u32) 최소 4000 보장
bufferImageGranularity 버퍼 혹은 선형 이미지, 최적 이미지 자원이 겹침 없이 같은 VkDeviceMemory 객체에 인접하게 바인드할 수 있는 세분성(granularity)입니다. (u64) 최대 131072
sparseAddressSpaceSize 희소 메모리 자원에 사용할 수 있는 총 주소 공간입니다. (u64) 희소 메모리 기능 지원 시 최소 2^31 보장
maxBoundDescriptorSets 한 파이프라인에서 동시에 사용할 수 있는 최대 기술자 집합 수입니다. (u32) 최소 4 보장
maxPerStageDescriptorSamplers 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 샘플러의 최대 수입니다. (u32) 최소 16 보장
maxPerStageDescriptorUniformBuffers 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 uniform 버퍼의 최대 수입니다. (u32) 최소 12 보장
maxPerStageDescriptorStorageBuffers 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 저장소 버퍼의 최대 수입니다. (u32) 최소 4 보장
maxPerStageDescriptorSampledImages 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 샘플드 이미지의 최대 수입니다. (u32) 최소 16 보장
maxPerStageDescriptorStorageImages 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 저장소 이미지의 최대 수입니다. (u32) 최소 4 보장
maxPerStageDescriptorInputAttachments 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 입력 첨부물의 최대 수입니다. (u32) 최소 4 보장
maxPerStageResources 파이프라인 중 셰이더 단계 하나에서 접근할 수 있는 자원의 최대 수입니다. 자원은 위의 이미지/합성 샘플러/저장소 버퍼/텍셀 버퍼/입력 첨부물/공유 버퍼를 모두 포함하며 프레임버퍼 색 첨부물도 포함됩니다. (u32) 최소 128 보장
maxDescriptorSetSamplers 파이프라인 레이아웃에 들어갈 수 있는 샘플러의 최대 수입니다. (u32) 단계당 최소 96 보장
maxDescriptorSetUniformBuffers 파이프라인 레이아웃에 들어갈 수 있는 (동적)공유 버퍼의 최대 수입니다. (u32) 단계당 최소 72 보장
maxDescriptorSetUniformBuffersDynamic 파이프라인 레이아웃에 들어갈 수 있는 동적 공유 버퍼의 최대 수입니다. (u32) 최소 8 보장
maxDescriptorSetStorageBuffers 파이프라인 레이아웃에 들어갈 수 있는 (동적)저장소 버퍼의 최대 수입니다. (u32) 단계당 최소 24 보장
maxDescriptorSetStorageBufferDynamic 파이프라인 레이아웃에 들어갈 수 있는 동적 저장소 버퍼의 최대 수입니다. (u32) 최소 4 보장
maxDescriptorSetSampledImages 파이프라인 레이아웃에 들어갈 수 있는 샘플드 이미지(합성 이미지 샘플러, 공유 텍셀버퍼, 샘플드 이미지)의 최대 수입니다. (u32) 단계당 최소 96 보장
maxDescriptorSetStorageImages 파이프라인 레이아웃에 들어갈 수 있는 저장소 이미지의 최대 수입니다. (u32) 단계당 최소 24 보장
maxDescriptorSetInputAttachments 파이프라인 레이아웃에 들어갈 수 있는 입력 첨부물의 최대 수입니다. (u32) 최소 4 보장
maxVertexInputAttributes 파이프라인에 명시될 수 있는 정점 입력 속성(VkVertexInputAttributeDescription)의 최대 수입니다. (u32) 최소 16 보장
maxVertexInputBindings 파이프라인에 명시될 수 있는 정점 속성 집합(VkVertexInputBindingDescription)의 최대 수입니다. (u32) 최소 16 보장
maxVertexInputAttributeOffset 정점 속성의 오프셋으로 가능한 최대값입니다. (u32) 최소 2047 보장
maxVertexInputBindingStride 한 정점 데이터부터 다음 정점 데이터까지의 간격의 최대값입니다. (u32) 최소 2048 보장
maxVertexOutputComponents 정점 셰이더의 출력 변수의 최대 총 요소 수입니다. (요소 수라고 표현된 걸 보니 아마 vec4는 4개로 치는 식 같습니다) (u32) 최소 64 보장
maxTessellationGenerationLevel 고정 기능 테셀레이션 도형 생성기에서 지원하는 최대 테셀레이션 생성 수준입니다.  (u32) 지원 시 최소 64 보장
maxTessellationPatchSize 테셀레이션 컨트롤 셰이더와 기초 도형 생성기에서 처리될 수 있는 패치의 정점의 최대 수입니다. (u32) 지원 시 최소 32 보장
maxTessellationControlPerVertexInputComponents 테셀레이션 컨트롤 셰이더에 입력되는 정점당 가능한 최대 요소 수입니다. (u32) 지원 시 최소 64 보장
maxTessellationControlPerVertexOutputComponents 테셀레이션 컨트롤 셰이더에서 출력되는 정점당 가능한 최대 요소 수입니다. (u32) 지원 시 최소 64 보장
maxTessellationControlPerPatchOutputComponents 테셀레이션 컨트롤 셰이더에서 출력되는 패치당 가능한 최대 요소 수입니다. (u32) 지원 시 최소 120 보장
maxTessellationControlTotalOutputComponents 테셀레이션 컨트롤 셰이더에서 출력될 수 있는 최대의 총 요소 수입니다. (u32) 지원 시 최소 2048 보장
maxTessellationEvaluationInputComponents 테셀레이션 계산 셰이더에 입력될 수 있는 정점당 최대 입력 요소 수입니다. (u32) 지원 시 최소 64 보장
maxTessellationEvaluationOutputComponents 테셀레이션 계산 셰이더에서 출력될 수 있는 정점당 최대 입력 요소 수입니다. (u32) 지원 시 최소 64 보장
maxGeometryShaderInvocations 인스턴스드 지오메트리 셰이더에서 한 번에 같이 실행될 수 있는 최대 병렬 수 입니다. (u32) 지원 시 최소 32 보장
maxGeometryInputComponents 지오메트리 셰이더 총 입력 변수의 최대 요소 수입니다. (u32) 지원 시 최소 64 보장
maxGeometryOutputComponents 지오메트리 셰이더 총 출력 변수의 최대 요소 수입니다. (u32) 지원 시 최소 64 보장
maxGeometryOutputVertices 지오메트리 셰이더에서 새로이 내보낼 수 있는 최대 정점 수입니다. (u32) 지원 시 최소 256 보장
maxGeometryTotalOutputComponents 지오메트리 셰이더에서 내보내는 모든 정점에 대한 출력 변수의 총 수의 최대값입니다. (u32) 지원 시 최소 1024 보장
maxFragmentInputComponents 조각 셰이더 입력 변수의 최대 요소 수입니다. (u32) 최소 64 보장
maxFragmentOutputAttachments 조각 셰이더 출력의 최대 첨부물 수입니다. (u32) 최소 4 보장
maxFragmentDualSrcAttachments 듀얼 소스 블렌드 모드로 블렌딩하는 출력물로 쓸 수 있는 최대 출력 첨부물 수입니다. (u32) 지원 시 최소 1 보장
maxFragmentCombinedOutputResources 조각 셰이더에서 내보낼 수 있는 저장소 버퍼, 저장소 이미지, Location으로 명시된 색 첨부물를 모두 합한 것의 최대 가능 수입니다. (u32) 최소 4 보장
maxComputeSharedMemorySize 컴퓨트 셰이더에서 선언된 작업 그룹 저장소 클래스가 쓸 수 있는 최대 메모리 용량입니다. (u32) 최소 16384 보장
maxComputeWorkGroupCount 한 디스패치 명령에서 가져올 수 있는 최대의 지역 작업 그룹 수(x,y,z 차원)입니다. (u32[3]) 모두 최소 65536 보장
maxComputeWorkGroupInvocations 컴퓨트 셰이더의 한 지역 작업 그룹에서 한 번에 병렬 실행 될 수 있는 최대 수입니다. (u32) 최소 128 보장
maxComputeWorkGroupSize 차원(x,y,z)당 지역 계산 작업 그룹의 최대 크기입니다. (u32[3]) 최소 128, 128, 64 보장
subPixelPrecisionBits 프레임버퍼 좌표의 서브픽셀 정밀도(비트 수)입니다. (u32) 최소 4 보장
subTexelPreceisionBits 이미지 축소/확대 필터의 축에 대한 나눗셈 정밀도(비트 수, 즉 2의 n제곱만큼)입니다. (u32) 최소 4 보장
mipmapPrecisionBits 밉맵 접근을 위한 LOD 계산 시 나눗셈의 정밀도(비트 수)입니다. (u32) 최소 4 보장
maxDrawIndexedIndexValue 32비트 인덱스 버퍼로 그릴 때 쓸 수 있는 최대 인덱스 값입니다. (모든 비트가 1인 것은 끊기용이므로 제외됨) (u32) 미지원시 최소 2^24-1, 지원시 최소 2^32-1 보장
maxDrawIndirectCount 간접 그리기 명령에서 지원되는 최대 그리기 수입니다. (u32) 미지원시 1, 지원시 최소 2^16-1 보장
maxSamplerLodBIas 샘플러 LOD bias의 가능한 최대 절대값입니다. (float) 최소 2 보장
maxSamplerAnisotropy 샘플러 비등방성 필터링의 최대 샘플 수입니다. (float) 미지원시 1, 지원시 최소 16 보장
maxViewports 활성 뷰포트의 가능한 최대 수입니다. (u32) 미지원시 1, 지원시 최소 16 보장
maxViewportDimensions 각 뷰포트의 최대 크기(픽셀)입니다. (u32[2]) 최소 4096 x 4096 보장
viewportBoundsRange 뷰포트의 모퉁이들이 포함되어야 하는 범위입니다. (float[2]) 범위 (-8192,8191) 보장
viewportSubPixelBits 뷰포트 경계의 서브픽셀 정밀도(비트 수)입니다. (u32) 최소 0 보장
minMemorymapAlignment HOST_VISIBLE 메모리에 대하여 할당되는 데이터의 정렬 요구사항입니다. 반드시 2의 거듭제곱의 값을 가집니다. (size_t) 최소 64
minTexelBufferOffsetAlignment 텍셀 버퍼의 뷰의 offset의 정렬 요구사항입니다. 반드시 2의 거듭제곱의 값을 가집니다. (u64) 최대 256
minUniformBufferOffsetAlignment 공유 버퍼의 메모리 정렬 요구사항입니다. 반드시 2의 거듭제곱의 값을 가집니다. (u64) 최대 256
minStorageBufferOffsetAlignment 저장소 버퍼의 메모리 정렬 요구사항입니다. 반드시 2의 거듭제곱을 가집니다. (u64) 최대 256
minTexelOffset OpImageSample* 또는 OpImageFetch* 명령들에 들어가는 이미지에 대해 ConstOffset으로 들어갈 수 있는 최소의 텍셀 오프셋 값입니다. (i32) 최대 -8
maxTexelOffset OpImageSample* 또는 OpImageFetch* 명령들에 들어가는 이미지에 대해 ConstOffset으로 들어갈 수 있는 최대의 텍셀 오프셋 값입니다. (u32) 최소 7
minTexelGatherOffset OpImage*Gather 명령들에 들어가는 이미지에 대해 Offset, ConstOffset, ConstOffsets로 들어갈 수 있는 최소의 오프셋 값입니다. (i32) 지원 시 최대 -8
maxTexelGatherOffset OpImage*Gather 명령들에 들어가는 이미지에 대해 Offset, ConstOffset, ConstOffsets로 들어갈 수 있는 최대의 오프셋 값입니다. (u32) 지원 시 최소 7
minInterpolationOffset sampleRateShading에서 InterpolateAtOffset 확장 명령에 들어갈 수 있는 최소의 Offset값입니다. (float) 지원 시 최대 -0.5
maxInterpolationOffset sampleRateShading에서 InterpolateAtOffset 확장 명령에 들어갈 수 있는 최대의 Offset값입니다. (float) 지원 시 최소 0.5 - (1 ULP). ULP는 subPixelInterpolationOffsetBits를 0.5에 제곱한 값
subPixelInterpolationOffsetBits InterpolateAtOffset 확장 명령에 대한 x, y 오프셋을 고정 소수점 값으로 반올림할 수 있는 분수 비트 수입니다. (u32) 지원 시 최소 4
maxFramebufferWidth 최대 프레임버퍼 너비입니다. (u32) 최소 4096 보장
maxFramebufferHeight 최대 프레임버퍼 높이입니다. (u32) 최소 4096 보장
maxFramebufferLayers 최대 프레임버퍼 층수입니다. (u32) 최소 256 보장
framebufferColorSampleCounts 가능한 프레임버퍼의 색 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
framebufferDepthSampleCounts 가능한 깊이 버퍼의 깊이 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
framebufferStencilSampleCounts 가능한 스텐실 버퍼의 스텐실 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
framebufferNoAttachmentsSampleCounts 첨부물 없는 서브패스에서 지원되는 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
maxColorAttachments 한 서브패스에서 사용할 수 있는 최대 색 첨부물 수입니다. (u32) 최소 4 보장
sampledImageColorSampleCounts 최적 타일링의 비 정수 색 형식 2D 샘플드 이미지의 가능한 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
sampledImageIntegerSampleCounts 최적 타일링의 정수 색 형식 2D 샘플드 이미지의 가능한 샘플 수입니다. (vksampleCountflags 비트) 최소 1개 보장
sampledImageDepthSampleCounts 최적 타일링의 깊이 형식 2D 샘플드 이미지의 가능한 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
sampledImageStencilSampleCounts 최적 타일링의 스텐실 형식 2D 샘플드 이미지의 가능한 샘플 수입니다. (vksampleCountflags 비트) 최소 1개/4개 보장
storageImageSampleCounts 최적 타일링의 2D 저장소 이미지의 가능한 샘플 수입니다. (vksampleCountflags 비트) 최소 1개 보장, 지원 시 4개도 보장
maxSampleMaskWords SampleMask 변수 배열의 최대 길이입니다. (u32) 최소 1 보장
timestampComputeAndGraphics 모든 그래픽스/계산 큐에 대한 타임스탬프 지원 여부입니다. (bool32)  
timestampPeriod 타임스탬프 질의가 1 증가하기 위해 필요한 시간(ns)입니다. (float)  
maxClipDistances 단일 셰이더 단계에서 사용할 수 있는 클립 거리의 최대 수입니다. (u32) 지원 시 최소 8 보장
maxCullDistances 단일 셰이더 단계에서 사용할 수 있는 컬 거리의 최대 수입니다. (u32) 지원 시 최소 8 보장
maxCombinedClipAndCullDistances 단일 셰이더 단계에서 사용할 수 있는 조합된 클립/컬 거리의 최대 수입니다. (u32) 지원 시 최소 8 보장
discreteQueuePriorities 큐 우선도로 들어갈 수 있는 이산 값의 수입니다. 최소 2 보장
pointSizeRange 점 표시 크기의 가능한 범위입니다. (float[2]) 1 이상, 64 - 0.5^pointSizeGranularity 이하
lineWidthRange 선 표시 굵기의 가능한 범위입니다. (float[2]) 1 이상, 8 - 0.5^lineWidthGranularity 이하
pointSizeGranularity 지원되는 점 표시 크기의 정밀도(granularity)입니다. 바로 오른쪽 위를 참고하세요. (float) 지원 시 최대 1.0
lineWidthGranularity 지원되는 선 표시 굵기의 정밀도(granularity)입니다. 바로 오른쪽 위를 참고하세요. (float) 지원 시 최대 1.0
strictLines 래스터화된 선이 선호되는 방식으로 반드시 되는지 여부입니다. (bool32)  
standardSampleLocations 래스터화가 여기 나온 대로 표준 샘플 위치를 사용하는지 여부입니다. (bool32)  
optimalBufferCopyOffsetAlignment 버퍼와 이미지 간의 변환 명령에 대한 최적의 오프셋 정렬입니다. 텍셀당 정렬 요구사항은 강제되지만 응용은 성능을 위해 최적의 정렬을 사용해야 합니다. 이 값은 반드시 2의 거듭제곱입니다.  (u64)  
optimalBufferCopRowPitchAlignment 버퍼와 이미지 간의 변환 명령에 대한 최적의 행 피치 (한 행이 실제로 차지하는 용량)정렬입니다. 이 값은 반드시 2의 거듭제곱입니다. (u64)  
nonCoherentAtomSize 매핑된 장치 메모리에 대한 동시 접근의 경계를 정하는 크기와 정렬입니다. 반드시 2의 거듭제곱입니다. (u64) 최대 256

 

limits의 경우 한계의 근처라도 가면 대체로 성능상 매우 안 좋은 영향이 갈 거고(예를 들어 한 번에 샘플드 이미지 16개를 쓰면 메모리 대역폭이..), 그런 만큼 Vulkan이 지원되는 하드웨어에서는 한계가 굉장히 널널한 편입니다. 때문에 특수한 목적이 있는 경우에나 확인하게 될 겁니다.

 

그보다는 '요구사항'이라고 적힌 부분을 관련 기능 사용 시 꼭 조사해야 합니다.

 

5. 나머지

뭔가 한 군데에 모으는 것이 더 필요하다면 추가하겠습니다.

위에 없는 것들 중에서는 대체로 surface capabilities, surface formats 정도 참고할 것 같은데 얘네들은 내용이 적어서 IDE 상에서 이름만으로 알아볼 수 있지 않을까 하네요.