2022. 9. 25. 15:31ㆍVulkan/특별편
개요
물리 장치 속성과 역량 중에서 장치 생성은 시작 시 그래픽카드(내장 그래픽) 선택에 참고할 뿐 아니라, 선택 시 저장해 둘 만한 값이 응용에 따라 달리 있을 겁니다. 이번 글은 그것을 판단하는 데 도움이 되기 위해 간결히 모아 두는 것입니다.
주의) 확장 기능(e.g. 끝에 2나 EXT, KHR 같은 게 붙은 것들)은 내용이 어려워져서 여기선 다루지 않습니다. 물론 확장이 아닌 것도 쉽지 않은 내용이 있어 정보가 부족할 수 있습니다.
목차
1. 우리의 선택권
2. vkGetPhysicalDeviceFeatures
3. vkGetPhysicalDeviceMemoryProperties
4. vkGetPhysicalDeviceProperties
4.1. 역량(limits)
5. 나머지
본문
1. 우리의 선택권
지금 쓸 수 있는 속성 물리 장치 조사 관련 내용은 아래 접은글에 나와 있습니다. (확장과 무관한 내용은 색 음영을 주었습니다.)
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_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_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 상에서 이름만으로 알아볼 수 있지 않을까 하네요.
'Vulkan > 특별편' 카테고리의 다른 글
안드로이드 스튜디오 NDK와 Vulkan - 2 (0) | 2022.10.23 |
---|---|
Vulkan instance와 device 확장들 (0) | 2022.09.18 |
안드로이드 스튜디오 NDK와 Vulkan - 1 (0) | 2022.08.21 |