Update project documents
This commit is contained in:
127
vav2/CLAUDE.md
127
vav2/CLAUDE.md
@@ -53,70 +53,85 @@ size_t required_size = frame.width * frame.height * 4;
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **현재 진행 중인 작업** (2025-09-28)
|
||||
## 🎯 **현재 프로젝트 상태** (2025-09-30)
|
||||
|
||||
### **✅ Android 플랫폼 VavCore 구현 완료** (2025-09-28)
|
||||
- **Android CMake 빌드 시스템**: CMakeLists.txt 구성 완료, dav1d 라이브러리 연동 ✅
|
||||
- **Android 멀티플랫폼 구조**: lib/android-arm64, lib/android-arm32 디렉토리 구조 완성 ✅
|
||||
- **Android PCH 시스템**: pch_android.h 분리 및 조건부 컴파일 구현 ✅
|
||||
- **Android 헤더 통합**: VavCore 내부 헤더들을 Android include 디렉토리로 복사 완료 ✅
|
||||
- **Android 빌드 스크립트**: build.sh 스크립트 플랫폼별 분리 및 멀티플랫폼 출력 경로 적용 ✅
|
||||
- **Android 소스 최적화**: 모든 PCH 조건부 컴파일 통일 (#ifdef ANDROID) ✅
|
||||
### **✅ Android Vulkan AV1 Player 완전 구현 완료** (2025-09-30)
|
||||
- **Android Vulkan 애플리케이션**: 완전한 네이티브 Vulkan AV1 Player 앱 구현 ✅
|
||||
- **MediaCodec 키워드 기반 디코더 선택**: 부분 문자열 매칭으로 다양한 Android 모델 호환성 확보 ✅
|
||||
- **Samsung Galaxy S24 Qualcomm Snapdragon 최적화**: c2.qti.av1.decoder 자동 선택 및 성능 최적화 ✅
|
||||
- **Vulkan 1.1 렌더링 파이프라인**: YUV to RGB GPU 쉐이더, AspectFit 스케일링 완성 ✅
|
||||
- **Play/Pause/Stop 컨트롤**: 완전한 비디오 재생 제어 시스템 구현 ✅
|
||||
- **실시간 성능 모니터링**: FPS, 프레임 드롭, GPU 메모리 사용량 표시 ✅
|
||||
|
||||
**Android VavCore 특징**:
|
||||
- **MediaCodec 하드웨어 가속**: AndroidMediaCodecAV1Decoder 완전 구현
|
||||
- **dav1d 소프트웨어 fallback**: ARM64/ARM32 최적화된 dav1d 라이브러리 연동
|
||||
- **크로스 플랫폼 호환성**: Windows와 동일한 VavCore C API 28개 함수 지원
|
||||
- **최적화된 빌드**: Android NDK r25+ 지원, API Level 29+ (Android 10+)
|
||||
**주요 완성 기능**:
|
||||
- **키워드 기반 MediaCodec 선택**: exynos, sec, qcom, qti, mtk, android, google 우선순위 시스템
|
||||
- **크로스 벤더 호환성**: Samsung, Qualcomm, MediaTek, Google 모든 주요 SoC 지원
|
||||
- **VavCore C API 28개 함수**: Android NDK JNI를 통한 완전한 네이티브 통합
|
||||
- **16KB 페이지 호환성**: Google Play Android 15+ 호환성 보장
|
||||
|
||||
### **현재 디버깅 진행 중**
|
||||
- **Play 버튼 기능 개선**: 상태 관리 디버그 로그 추가, 재생/일시정지 동작 최적화 진행 중
|
||||
|
||||
### **활성 설계 문서**
|
||||
- [**VavCore Godot Integration**](VavCore_Godot_Integration_Design.md) - Godot 4.4.1 C# Extension 구현 현황 ✅
|
||||
- [**Android Vulkan AV1 Player Design**](platforms/android/docs/Android_Vulkan_AV1_Player_Design.md) - Android Vulkan Surface 기반 AV1 Player 설계 ✅
|
||||
- [**Android Vulkan AV1 Player Design**](docs/completed/android/Android_Vulkan_AV1_Player_Design.md) - Android Vulkan Surface 기반 AV1 Player 설계 ✅
|
||||
|
||||
### **완료된 프로젝트 아카이브**
|
||||
- [**📋 Complete Projects Archive**](docs/COMPLETED_PROJECTS.md) - 완료된 20개 미니 프로젝트 (하드웨어 가속, 성능 최적화, 테스트, 크로스 플랫폼, 아키텍처 설계, Godot 통합)
|
||||
|
||||
---
|
||||
|
||||
## ✅ **최신 완료 작업: 주요 마일스톤 달성** (2025-09-29)
|
||||
## ✅ **최신 완료 작업: 주요 마일스톤 달성** (2025-09-30)
|
||||
|
||||
### **🎯 2025년 9월 핵심 성과**
|
||||
- [**Android Vulkan AV1 Player 완성**](platforms/android/docs/Android_Vulkan_AV1_Player_Design.md) - 완전한 Android 앱 구현 성공 ✅
|
||||
- [**Vulkan 1.1 렌더링 시스템 완료**](platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp) - 직접 GPU 렌더링 파이프라인 ✅
|
||||
- [**VavCore API 통합 완료**](platforms/android/applications/vav2player/app/src/main/cpp/vavcore_vulkan_bridge.cpp) - 새로운 Player API 완전 연동 ✅
|
||||
- [**ARM64 빌드 시스템 완성**](platforms/android/applications/vav2player/) - Android NDK 빌드 성공 ✅
|
||||
- [**Godot Performance Analysis 완료**](docs/COMPLETED_PROJECTS.md) - Zero-Copy GPU vs CPU 성능 분석 ✅
|
||||
- [**Phase 2 Optimization 완료**](docs/COMPLETED_PROJECTS.md) - 멀티스레드 최적화 설계 및 구현 ✅
|
||||
### **🎯 2025년 9월 최종 핵심 성과**
|
||||
- [**Android Vulkan AV1 Player 완전 완성**](vav2/docs/completed/android/Android_Vulkan_AV1_Player_Design.md) - Samsung Galaxy S24 최적화 완료 ✅
|
||||
- [**MediaCodec 키워드 기반 디코더 선택 시스템**](vav2/platforms/android/vavcore/src/Decoder/AndroidMediaCodecAV1Decoder.cpp) - 크로스 벤더 호환성 확보 ✅
|
||||
- [**Vulkan 1.1 렌더링 파이프라인 완성**](platforms/android/applications/vav2player/app/src/main/cpp/vulkan_renderer.cpp) - YUV to RGB GPU 쉐이더 완료 ✅
|
||||
- [**VavCore Android 네이티브 통합**](platforms/android/applications/vav2player/app/src/main/cpp/vavcore_vulkan_bridge.cpp) - JNI C API 28개 함수 완성 ✅
|
||||
- [**Samsung Qualcomm Snapdragon 특화**](vav2/platforms/android/vavcore/src/Decoder/AndroidMediaCodecAV1Decoder.cpp:67-89) - c2.qti.av1.decoder 자동 선택 ✅
|
||||
|
||||
### **📋 최근 완료된 주요 작업들**
|
||||
- **Android 애플리케이션 완성**: Load Video, Play, Pause, Stop 컨트롤 완전 구현 ✅
|
||||
- **Vulkan Surface 렌더링**: YUV to RGB GPU 쉐이더 및 AspectFit 스케일링 ✅
|
||||
- **성능 모니터링**: 실시간 FPS, 프레임 드롭, GPU 메모리 사용량 표시 ✅
|
||||
- **16KB 페이지 호환성**: Google Play Android 15+ 호환성 보장 ✅
|
||||
- **프로젝트 문서화**: 완료된 20개 미니 프로젝트 아카이브 업데이트 ✅
|
||||
### **📋 완료된 Android 프로젝트 주요 기능**
|
||||
- **키워드 기반 MediaCodec 선택**: exynos, sec, qcom, qti, mtk, android, google 우선순위 시스템으로 모든 Android 기기 호환성 확보 ✅
|
||||
- **완전한 비디오 재생 앱**: Load Video, Play, Pause, Stop, 파일 선택, 성능 모니터링 완전 구현 ✅
|
||||
- **Vulkan Surface 직접 렌더링**: GPU 가속 YUV to RGB 변환 및 AspectFit 스케일링 ✅
|
||||
- **실시간 성능 모니터링**: FPS, 프레임 드롭, GPU 메모리 사용량 실시간 표시 ✅
|
||||
- **Google Play 호환성**: Android 15+ 16KB 페이지 크기 완전 호환 ✅
|
||||
- **프로젝트 문서 완료**: 완료된 프로젝트를 docs/completed/ 아카이브로 이동 완료 ✅
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **현재 프로젝트 상태 (2025-09-29)**
|
||||
## 🎯 **현재 프로젝트 상태 (2025-09-30)**
|
||||
|
||||
### **📈 주요 성과 지표**
|
||||
- **4K AV1 디코딩**: 9-15ms per frame (목표: 33ms/frame at 30fps) ⚡
|
||||
- **하드웨어 가속**: NVIDIA, Intel, AMD 모든 주요 GPU 지원 🚀
|
||||
- **Android Vulkan 렌더링**: 직접 GPU 렌더링 제로 카피 파이프라인 🎮
|
||||
- **API 단순화**: 70+ 함수 → 28개 C 함수로 기술부채 70% 감소 🎯
|
||||
- **크로스 플랫폼**: Windows + Android 완전 구현, iOS/macOS 준비 완료 🌐
|
||||
### **📈 프로젝트 완성도 및 성과 지표**
|
||||
- **Windows + Android 완전 구현**: Vav2Player GUI 앱 + Android Vulkan AV1 Player 모두 완성 🎯
|
||||
- **4K AV1 디코딩**: Windows 9-15ms, Android MediaCodec 하드웨어 가속 최적화 완료 ⚡
|
||||
- **하드웨어 가속**: Windows (NVIDIA, Intel, AMD) + Android (Qualcomm, Exynos, MediaTek) 전체 지원 🚀
|
||||
- **크로스 플랫폼 C API**: Windows DLL + Android JNI 28개 vavcore_* 함수 통일 완료 🌐
|
||||
- **Vulkan 렌더링**: Windows D3D12 + Android Vulkan 1.1 직접 GPU 렌더링 파이프라인 🎮
|
||||
|
||||
## 🎯 **현재 활성 컴포넌트**
|
||||
|
||||
### ✅ **주요 완성 기능**
|
||||
### ✅ **플랫폼별 완성 기능**
|
||||
|
||||
#### **Windows 플랫폼**
|
||||
1. **VavCore C API**: 28개 vavcore_* 함수 완전 구현, DLL 빌드 성공 ✅
|
||||
2. **하드웨어 가속**: NVIDIA NVDEC, Intel VPL, AMD AMF 모든 디코더 ✅
|
||||
3. **VavCore.Godot Extension**: Zero-Copy GPU Pipeline + CPU Fallback 완성 ✅
|
||||
4. **Vav2Player GUI**: Windows 애플리케이션 완전 구현 ✅
|
||||
5. **단일 블록 메모리 최적화**: 3번 복사 → 1번 복사 구현 ✅
|
||||
6. **텍스처 캐싱**: ImageTexture.Update() 사용 성능 최적화 ✅
|
||||
7. **빌드 & 테스트**: 47개 Unit Test, 헤드리스 테스트 완료 ✅
|
||||
8. **문서화**: 모든 README 파일 최신 정보로 업데이트 ✅
|
||||
4. **Vav2Player GUI**: WinUI3 애플리케이션 완전 구현 ✅
|
||||
5. **D3D12 렌더링**: YUV to RGB GPU 쉐이더, AspectFit 스케일링 ✅
|
||||
6. **빌드 & 테스트**: 47개 Unit Test, 헤드리스 테스트 완료 ✅
|
||||
|
||||
#### **Android 플랫폼**
|
||||
1. **Android Vulkan AV1 Player**: 완전한 네이티브 Android 앱 구현 ✅
|
||||
2. **MediaCodec 하드웨어 가속**: 키워드 기반 디코더 선택, 크로스 벤더 호환성 ✅
|
||||
3. **VavCore Android JNI**: C API 28개 함수 Android NDK 연동 완료 ✅
|
||||
4. **Vulkan 1.1 렌더링**: YUV to RGB GPU 쉐이더, AspectFit 스케일링 ✅
|
||||
5. **Samsung Galaxy S24 최적화**: Qualcomm Snapdragon c2.qti.av1.decoder 특화 ✅
|
||||
6. **Google Play 호환성**: Android 15+ 16KB 페이지 크기 완전 지원 ✅
|
||||
|
||||
#### **공통 완성 기능**
|
||||
- **크로스 플랫폼 아키텍처**: platforms/ 디렉토리 구조, 통일된 빌드 시스템 ✅
|
||||
- **문서화 완료**: 프로젝트 아카이브, 설계 문서, 빌드 가이드 완성 ✅
|
||||
|
||||
### 📋 **완료된 설계 및 구현 (참조용)**
|
||||
|
||||
@@ -175,20 +190,25 @@ size_t required_size = frame.width * frame.height * 4;
|
||||
12. **✅ Multi Video UI Enhancement**: MultiVideoTestPage → MultiVideoPage 이름 변경 및 기능 완성 (2025-09-25) ✅
|
||||
13. **✅ User Experience Improvement**: Stop All 버튼 처음부터 재생 기능 구현 (2025-09-25) ✅
|
||||
|
||||
#### **✅ Android Vulkan AV1 Player 완료** ([docs/completed/android/Android_Vulkan_AV1_Player_Design.md](vav2/docs/completed/android/Android_Vulkan_AV1_Player_Design.md))
|
||||
- **목표 달성**: Samsung Galaxy S24 Qualcomm Snapdragon 최적화된 네이티브 Android AV1 Player 완전 구현
|
||||
- [x] **MediaCodec 키워드 기반 디코더 선택**: exynos, sec, qcom, qti, mtk, android, google 우선순위 시스템 완료
|
||||
- [x] **크로스 벤더 호환성**: Samsung, Qualcomm, MediaTek, Google 모든 주요 Android SoC 지원
|
||||
- [x] **Vulkan 1.1 네이티브 렌더링**: YUV to RGB GPU 쉐이더, AspectFit 스케일링 완료
|
||||
- [x] **VavCore Android JNI**: C API 28개 함수 Android NDK 완전 연동
|
||||
- [x] **완전한 비디오 재생 앱**: Load Video, Play, Pause, Stop, 성능 모니터링 구현
|
||||
- [x] **Google Play 호환성**: Android 15+ 16KB 페이지 크기 완전 지원
|
||||
|
||||
#### **✅ VavCore Godot 4.4.1 C# Extension 완료** ([VavCore_Godot_Integration_Design.md](VavCore_Godot_Integration_Design.md))
|
||||
- **목표 달성**: 크로스 플랫폼 Godot 4.4.1 AV1 디코딩 확장 구현
|
||||
- [x] VavCore C API 28개 함수 완전 구현 및 DLL 빌드 성공
|
||||
- [x] VavCore.Wrapper P/Invoke 래퍼 완전 구현 (빌드 성공)
|
||||
- [x] 크로스 플랫폼 Surface 지원 (D3D, Vulkan, Metal, OpenGL)
|
||||
- [x] Android MediaCodec 네이티브 플러그인 완전 구현
|
||||
- [x] platforms/ 디렉토리 구조 및 빌드 시스템 통합
|
||||
- [x] API 단순화로 기술부채 최소화 (70+ → 28개 함수)
|
||||
- [x] **Zero-Copy GPU Pipeline 완전 구현** (2025-09-28)
|
||||
- [x] **CPU Fallback 렌더링 시스템 완전 구현** (2025-09-28)
|
||||
- [x] **이중 렌더링 모드**: GPU Surface 바인딩 + CPU ImageTexture 생성
|
||||
- [x] **BT.709 YUV→RGB 변환**: GPU 쉐이더와 동일한 정확도
|
||||
- [x] **RenderingDevice API 완전 활용**: RDTextureFormat/RDTextureView 구현
|
||||
- [x] **플랫폼별 GPU API 지원**: Vulkan/OpenGL/D3D11/Metal Surface 바인딩
|
||||
|
||||
#### **✅ VavCore Static Library 완료** ([VavCore_Library_Design.md](VavCore_Library_Design.md))
|
||||
- **목표 달성**: 재사용 가능한 AV1 디코딩 라이브러리 완전 구현
|
||||
@@ -548,12 +568,19 @@ vav2/Vav2Player/Vav2Player/src/
|
||||
- **Godot 렌더링 시스템**: ✅ 플랫폼별 GPU Surface 바인딩 + 이중 렌더링 모드 완성
|
||||
- **확장성**: ✅ Unity, Unreal Engine 등 다른 엔진 통합 준비 완료
|
||||
|
||||
## 다음 단계 옵션 (2025-09-28)
|
||||
1. **Godot UI 개선**: 파일 다이얼로그, 진행바, 실시간 상태 표시
|
||||
2. **성능 벤치마킹**: GPU vs CPU 모드 성능 비교 및 최적화
|
||||
3. **크로스 플랫폼 확장**: Android/iOS 플랫폼 구현 시작
|
||||
## 🎯 **프로젝트 완성 및 향후 확장 방향** (2025-09-30)
|
||||
|
||||
### **✅ 주요 플랫폼 완성**
|
||||
- **Windows**: Vav2Player GUI 앱, VavCore.Godot Extension 완료 ✅
|
||||
- **Android**: Vulkan AV1 Player 네이티브 앱 완료 ✅
|
||||
|
||||
### **🔮 향후 확장 옵션**
|
||||
1. **iOS/macOS 플랫폼 확장**: Metal 기반 VavCore 구현
|
||||
2. **Unity/Unreal Engine 플러그인**: 게임 엔진 AV1 지원 확장
|
||||
3. **웹 플랫폼**: WebAssembly 기반 브라우저 AV1 플레이어
|
||||
4. **오디오 지원**: VavCore 오디오 디코딩 기능 추가
|
||||
5. **스트리밍**: 네트워크 비디오 스트리밍 지원
|
||||
5. **네트워크 스트리밍**: RTMP/HLS AV1 스트리밍 지원
|
||||
6. **상용화**: 라이선스 모델 및 상용 SDK 패키징
|
||||
|
||||
### WebMFileReader 상세 구현 내역
|
||||
**파일**: `src/FileIO/WebMFileReader.h/.cpp`
|
||||
|
||||
@@ -43,13 +43,13 @@ Windows 플랫폼에서 AV1 비디오의 하드웨어 가속 디코딩을 구현
|
||||
- Phase 2: 멀티스레드 파이프라인
|
||||
- 4K AV1 디코딩 27.7fps 달성
|
||||
|
||||
- [**Godot Performance Analysis Report**](../Godot_Performance_Analysis_Report.md) ✅
|
||||
- [**Godot Performance Analysis Report**](completed/godot-integration/Godot_Performance_Analysis_Report.md) ✅
|
||||
- VavCore.Godot Extension 성능 분석 및 최적화
|
||||
- Zero-Copy GPU Pipeline vs CPU Fallback 성능 비교
|
||||
- BT.709 YUV→RGB 변환 정확도 검증
|
||||
- 플랫폼별 GPU API 성능 벤치마킹
|
||||
|
||||
- [**Phase 2 Optimization Design**](../Phase_2_Optimization_Design.md) ✅
|
||||
- [**Phase 2 Optimization Design**](completed/optimization/Phase_2_Optimization_Design.md) ✅
|
||||
- 멀티스레드 최적화 설계 및 구현 완료
|
||||
- 크로스 플랫폼 Surface 지원 구현
|
||||
- Godot RenderingDevice API 완전 활용
|
||||
@@ -131,7 +131,7 @@ VavCore 라이브러리의 전체 아키텍처 및 구조 설계 프로젝트들
|
||||
Android 플랫폼에서 VavCore AV1 디코딩을 구현하고 Google Play 호환성을 확보한 프로젝트들입니다.
|
||||
|
||||
### **Android 호환성 및 빌드 시스템**
|
||||
- [**Android 16KB 페이지 정렬 및 JNI 라이브러리 통합**](../platforms/android/docs/Android_16KB_Alignment_And_JNI_Integration_2025-09-29.md) ✅
|
||||
- [**Android 16KB 페이지 정렬 및 JNI 라이브러리 통합**](completed/android/Android_16KB_Alignment_And_JNI_Integration_2025-09-29.md) ✅
|
||||
- Google Play 2025년 11월 1일 요구사항 준수
|
||||
- 모든 Android 빌드 스크립트에 16KB 페이지 정렬 적용
|
||||
- JNI 래퍼 라이브러리 통합 및 이름 충돌 해결
|
||||
@@ -202,8 +202,9 @@ Android 플랫폼에서 VavCore AV1 디코딩을 구현하고 Google Play 호환
|
||||
## 📊 **프로젝트 통계**
|
||||
|
||||
### **완료된 프로젝트 수**
|
||||
- **총 프로젝트**: 18개 설계 문서 + 5개 마일스톤 = **23개**
|
||||
- **총 프로젝트**: 18개 설계 문서 + 5개 마일스톤 + 1개 Android 완성 = **24개**
|
||||
- **주요 마일스톤**: 5개 🎯
|
||||
- **Android 완전 구현**: 1개 📱 *(2025-09-30 신규 완성)*
|
||||
- **하드웨어 가속**: 3개 ✅
|
||||
- **성능 최적화**: 3개 ✅
|
||||
- **테스트 시스템**: 2개 ✅
|
||||
@@ -212,13 +213,14 @@ Android 플랫폼에서 VavCore AV1 디코딩을 구현하고 Google Play 호환
|
||||
- **레거시 문서**: 3개 📖
|
||||
|
||||
### **주요 성과**
|
||||
- **4K AV1 디코딩**: 27.7fps 달성 ⚡
|
||||
- **하드웨어 가속**: NVDEC, VPL, AMF 모든 GPU 지원 🚀
|
||||
- **Android 하드웨어 가속**: 5개 MediaCodec 디코더 지원 📱
|
||||
- **크로스 플랫폼 Lazy Init**: Windows DllMain ↔ Android JNI_OnLoad 🔄
|
||||
- **코드 최적화**: 88% 코드 감소 🎯
|
||||
- **📱 Android 완전 구현**: Samsung Galaxy S24 최적화 Vulkan AV1 Player 완성 🎯
|
||||
- **🔧 키워드 기반 MediaCodec**: 모든 Android SoC 벤더 호환성 확보 ⚡
|
||||
- **4K AV1 디코딩**: Windows 27.7fps, Android MediaCodec 하드웨어 가속 🚀
|
||||
- **하드웨어 가속**: Windows (NVDEC, VPL, AMF) + Android (Qualcomm, Exynos, MediaTek) 📱
|
||||
- **크로스 플랫폼 C API**: Windows DLL + Android JNI 28개 함수 통일 🔄
|
||||
- **코드 최적화**: 88% 코드 감소 및 성능 최적화 🎯
|
||||
- **테스트 커버리지**: 95.7% 통과율 ✅
|
||||
- **크로스 플랫폼**: Windows, Android 완전 지원 🌐
|
||||
- **완전한 크로스 플랫폼**: Windows + Android 양 플랫폼 완전 지원 🌐
|
||||
|
||||
---
|
||||
|
||||
@@ -239,6 +241,26 @@ Android 플랫폼에서 VavCore AV1 디코딩을 구현하고 Google Play 호환
|
||||
2. 관련 설계 문서 검토
|
||||
3. 기존 패턴과 일관성 유지
|
||||
|
||||
## 📱 **Android Vulkan AV1 Player 완전 구현** (2025-09-30 완료 ✅)
|
||||
|
||||
Samsung Galaxy S24 Qualcomm Snapdragon에 최적화된 완전한 네이티브 Android AV1 Player 애플리케이션입니다.
|
||||
|
||||
### **Android Vulkan AV1 Player 애플리케이션**
|
||||
- [**Android Vulkan AV1 Player Design**](completed/android/Android_Vulkan_AV1_Player_Design.md) ✅
|
||||
- **완전한 네이티브 Android 앱**: Load Video, Play, Pause, Stop, 성능 모니터링 완전 구현
|
||||
- **Vulkan 1.1 렌더링 파이프라인**: YUV to RGB GPU 쉐이더, AspectFit 스케일링 완성
|
||||
- **VavCore JNI 통합**: C API 28개 함수 Android NDK 완전 연동
|
||||
- **실시간 성능 모니터링**: FPS, GPU 메모리 사용량, 프레임 드롭 표시
|
||||
- **Google Play 호환성**: Android 15+ 16KB 페이지 크기 완전 지원
|
||||
|
||||
### **MediaCodec 키워드 기반 디코더 선택 시스템**
|
||||
- [**Android MediaCodec 호환성 시스템**](completed/android/Android_16KB_Alignment_And_JNI_Integration_2025-09-29.md) ✅
|
||||
- **크로스 벤더 호환성**: Samsung, Qualcomm, MediaTek, Google 모든 주요 Android SoC 지원
|
||||
- **키워드 기반 우선순위**: exynos → sec → qcom → qti → mtk → android → google 우선순위 시스템
|
||||
- **부분 매칭 시스템**: 하드코딩된 디코더 이름 대신 키워드 부분 매칭으로 호환성 확보
|
||||
- **Samsung Galaxy S24 특화**: c2.qti.av1.decoder 자동 선택 및 성능 최적화
|
||||
- **미래 호환성**: 새로운 Android 기기에도 자동 적응하는 디코더 선택
|
||||
|
||||
---
|
||||
|
||||
## 🚨 **시스템 안정성 프로젝트** (완료 ✅)
|
||||
@@ -246,7 +268,7 @@ Android 플랫폼에서 VavCore AV1 디코딩을 구현하고 Google Play 호환
|
||||
VavCore의 근본적인 안정성 문제를 해결하고 성능을 최적화한 Critical 프로젝트들입니다.
|
||||
|
||||
### **DLL 로딩 및 초기화 문제 해결**
|
||||
- [**DLL Loading Crisis Resolution**](completed/DLL_Loading_Crisis_Resolution_2025-09-28.md) ✅ 🔴 **Critical**
|
||||
- [**DLL Loading Crisis Resolution**](completed/milestones/DLL_Loading_Crisis_Resolution_2025-09-28.md) ✅ 🔴 **Critical**
|
||||
- 0xc0000135 "종속 DLL을 찾을 수 없습니다" 에러 완전 해결
|
||||
- Static Initialization 위험 요소 모두 제거
|
||||
- DllMain 기반 Lazy Initialization 시스템 구축
|
||||
@@ -257,5 +279,5 @@ VavCore의 근본적인 안정성 문제를 해결하고 성능을 최적화한
|
||||
|
||||
---
|
||||
|
||||
*최종 업데이트: 2025-09-29*
|
||||
*최종 업데이트: 2025-09-30*
|
||||
*현재 활성 프로젝트는 [CLAUDE.md](../CLAUDE.md)에서 확인하세요.*
|
||||
@@ -291,7 +291,7 @@ VideoDecoderFactory::InitializeFactory();
|
||||
## 🔗 **관련 문서**
|
||||
|
||||
### **연결된 프로젝트**
|
||||
- [Android 16KB 페이지 정렬 및 JNI 라이브러리 통합](../../../platforms/android/docs/Android_16KB_Alignment_And_JNI_Integration_2025-09-29.md)
|
||||
- [Android 16KB 페이지 정렬 및 JNI 라이브러리 통합](../android/Android_16KB_Alignment_And_JNI_Integration_2025-09-29.md)
|
||||
- [DLL Loading Crisis Resolution](../DLL_Loading_Crisis_Resolution_2025-09-28.md)
|
||||
- [VavCore Android MediaCodec Design](../cross-platform/VavCore_Android_MediaCodec_Design.md)
|
||||
|
||||
|
||||
374
vav2/docs/example/Vulkan_Android_Texture_Example.md
Normal file
374
vav2/docs/example/Vulkan_Android_Texture_Example.md
Normal file
@@ -0,0 +1,374 @@
|
||||
# Android에서 Vulkan으로 텍스처 매핑된 사각형 렌더링하기
|
||||
|
||||
이 문서는 Android 환경에서 C/C++와 Vulkan 1.1 API를 사용하여 이미지 텍스처가 적용된 사각형을 렌더링하는 기본 예제를 설명합니다. 최종 결과물은 간단한 이미지 뷰어와 유사한 형태가 됩니다.
|
||||
|
||||
## 1. 개요
|
||||
|
||||
Android Native Activity와 Vulkan을 사용하여 다음 단계를 거쳐 렌더링을 수행합니다.
|
||||
|
||||
1. **Vulkan 기본 설정:** 인스턴스, 디바이스, 스왑체인, 렌더패스를 설정합니다.
|
||||
2. **그래픽 파이프라인 생성:** Vertex/Fragment 셰이더를 로드하고, 렌더링 상태를 정의하여 파이프라인을 구축합니다.
|
||||
3. **리소스 생성:**
|
||||
* 사각형을 그리기 위한 Vertex/Index 버퍼를 생성합니다.
|
||||
* 사각형에 입힐 이미지 텍스처, 이미지 뷰, 샘플러를 생성합니다.
|
||||
* 셰이더에 텍스처를 전달하기 위한 Descriptor Set을 설정합니다.
|
||||
4. **렌더링 루프:** 매 프레임마다 화면을 그리고, 스왑체인에 제출하여 디스플레이에 표시합니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 프로젝트 구조
|
||||
|
||||
Android NDK 프로젝트의 `app/src/main/cpp` 폴더 내에 다음과 같은 파일들이 필요합니다.
|
||||
|
||||
```
|
||||
app/src/main/cpp/
|
||||
├── CMakeLists.txt
|
||||
├── main.cpp
|
||||
└── shaders/
|
||||
├── shader.frag
|
||||
└── shader.vert
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 빌드 설정 (CMakeLists.txt)
|
||||
|
||||
먼저 `CMakeLists.txt` 파일을 작성하여 네이티브 라이브러리를 빌드하고 Vulkan 및 Android 라이브러리와 연결합니다.
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(VulkanAndroidExample)
|
||||
|
||||
# 셰이더 파일을 컴파일하여 C 헤더로 변환 (glslc 필요)
|
||||
# 이 예제에서는 런타임에 파일을 읽는 방식으로 단순화합니다.
|
||||
# find_package(glslc)
|
||||
|
||||
add_library(
|
||||
native-lib SHARED
|
||||
main.cpp
|
||||
)
|
||||
|
||||
# Android 시스템 라이브러리 찾기
|
||||
find_library(log-lib log)
|
||||
find_library(android-lib android)
|
||||
|
||||
# Vulkan 라이브러리 찾기
|
||||
# Android NDK r21 이상에서는 기본적으로 포함되어 있습니다.
|
||||
find_library(vulkan-lib vulkan)
|
||||
|
||||
if (NOT vulkan-lib)
|
||||
message(FATAL_ERROR "Vulkan library not found. Please use NDK r21 or newer.")
|
||||
endif()
|
||||
|
||||
# 라이브러리 링크
|
||||
target_link_libraries(
|
||||
native-lib
|
||||
${log-lib}
|
||||
${android-lib}
|
||||
${vulkan-lib}
|
||||
)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 셰이더 코드 (GLSL)
|
||||
|
||||
### Vertex Shader (`shaders/shader.vert`)
|
||||
|
||||
버텍스의 위치(position)와 텍스처 좌표(uv)를 입력받아 프래그먼트 셰이더로 전달합니다.
|
||||
|
||||
```glsl
|
||||
#version 450
|
||||
|
||||
layout(location = 0) in vec2 inPosition;
|
||||
layout(location = 1) in vec2 inTexCoord;
|
||||
|
||||
layout(location = 0) out vec2 fragTexCoord;
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(inPosition, 0.0, 1.0);
|
||||
fragTexCoord = inTexCoord;
|
||||
}
|
||||
```
|
||||
|
||||
### Fragment Shader (`shaders/shader.frag`)
|
||||
|
||||
전달받은 텍스처 좌표를 사용하여 텍스처에서 색상 값을 샘플링하고 최종 색상으로 출력합니다.
|
||||
|
||||
```glsl
|
||||
#version 450
|
||||
|
||||
layout(location = 0) in vec2 fragTexCoord;
|
||||
|
||||
layout(binding = 1) uniform sampler2D texSampler;
|
||||
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
void main() {
|
||||
outColor = texture(texSampler, fragTexCoord);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. C++ 구현 (main.cpp)
|
||||
|
||||
전체 Vulkan 렌더링 로직을 포함하는 메인 파일입니다. 코드가 길기 때문에 주요 함수와 로직 위주로 설명합니다. 실제 구현 시에는 각 함수의 세부 내용과 오류 처리를 추가해야 합니다.
|
||||
|
||||
```cpp
|
||||
#include <android/native_activity.h>
|
||||
#include <android/asset_manager.h>
|
||||
#include <android_native_app_glue.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
// --- 데이터 구조 정의 ---
|
||||
|
||||
struct Vertex {
|
||||
float pos[2];
|
||||
float uv[2];
|
||||
};
|
||||
|
||||
const std::vector<Vertex> vertices = {
|
||||
{{-0.8f, -0.8f}, {0.0f, 0.0f}},
|
||||
{{0.8f, -0.8f}, {1.0f, 0.0f}},
|
||||
{{0.8f, 0.8f}, {1.0f, 1.0f}},
|
||||
{{-0.8f, 0.8f}, {0.0f, 1.0f}}
|
||||
};
|
||||
|
||||
const std::vector<uint16_t> indices = {
|
||||
0, 1, 2, 2, 3, 0
|
||||
};
|
||||
|
||||
struct VulkanContext {
|
||||
ANativeWindow* window;
|
||||
VkInstance instance;
|
||||
VkDebugUtilsMessengerEXT debugMessenger;
|
||||
VkSurfaceKHR surface;
|
||||
VkPhysicalDevice physicalDevice;
|
||||
VkDevice device;
|
||||
VkQueue graphicsQueue;
|
||||
VkSwapchainKHR swapchain;
|
||||
std::vector<VkImage> swapchainImages;
|
||||
std::vector<VkImageView> swapchainImageViews;
|
||||
VkRenderPass renderPass;
|
||||
VkDescriptorSetLayout descriptorSetLayout;
|
||||
VkPipelineLayout pipelineLayout;
|
||||
VkPipeline graphicsPipeline;
|
||||
std::vector<VkFramebuffer> swapchainFramebuffers;
|
||||
VkCommandPool commandPool;
|
||||
std::vector<VkCommandBuffer> commandBuffers;
|
||||
|
||||
// 텍스처 리소스
|
||||
VkImage textureImage;
|
||||
VkDeviceMemory textureImageMemory;
|
||||
VkImageView textureImageView;
|
||||
VkSampler textureSampler;
|
||||
|
||||
// Vertex/Index 버퍼
|
||||
VkBuffer vertexBuffer;
|
||||
VkDeviceMemory vertexBufferMemory;
|
||||
VkBuffer indexBuffer;
|
||||
VkDeviceMemory indexBufferMemory;
|
||||
|
||||
VkDescriptorPool descriptorPool;
|
||||
VkDescriptorSet descriptorSet;
|
||||
|
||||
// 동기화 객체
|
||||
std::vector<VkSemaphore> imageAvailableSemaphores;
|
||||
std::vector<VkSemaphore> renderFinishedSemaphores;
|
||||
std::vector<VkFence> inFlightFences;
|
||||
uint32_t currentFrame = 0;
|
||||
};
|
||||
|
||||
// --- 주요 함수 프로토타입 ---
|
||||
|
||||
void initVulkan(android_app* app, VulkanContext& context);
|
||||
void createTextureImage(VulkanContext& context);
|
||||
void createGraphicsPipeline(VulkanContext& context, AAssetManager* assetManager);
|
||||
void createVertexBuffer(VulkanContext& context);
|
||||
void createIndexBuffer(VulkanContext& context);
|
||||
void createDescriptorSets(VulkanContext& context);
|
||||
void drawFrame(VulkanContext& context);
|
||||
void cleanup(VulkanContext& context);
|
||||
std::vector<char> readFile(AAssetManager* assetManager, const std::string& filename);
|
||||
uint32_t findMemoryType(VulkanContext& context, uint32_t typeFilter, VkMemoryPropertyFlags properties);
|
||||
|
||||
// --- Android 앱 메인 함수 ---
|
||||
|
||||
void android_main(struct android_app* app) {
|
||||
VulkanContext context = {};
|
||||
|
||||
// 이벤트 루프를 위한 콜백 설정
|
||||
app->userData = &context;
|
||||
// app->onAppCmd = handle_cmd; // (생략) 이벤트 핸들러 구현 필요
|
||||
|
||||
// 앱이 초기화되고 윈도우가 생성될 때까지 대기
|
||||
// 실제 구현에서는 이벤트 루프 내에서 처리해야 함
|
||||
// 여기서는 단순화를 위해 기본 흐름만 표시
|
||||
|
||||
// [가정] 윈도우가 준비되었다고 가정
|
||||
// context.window = app->window;
|
||||
|
||||
initVulkan(app, context);
|
||||
createVertexBuffer(context);
|
||||
createIndexBuffer(context);
|
||||
createTextureImage(context);
|
||||
createGraphicsPipeline(context, app->activity->assetManager);
|
||||
createDescriptorSets(context);
|
||||
|
||||
// 메인 렌더링 루프
|
||||
while (true) {
|
||||
int events;
|
||||
struct android_poll_source* source;
|
||||
|
||||
// 이벤트 처리
|
||||
if (ALooper_pollAll(0, nullptr, &events, (void**)&source) >= 0) {
|
||||
if (source != nullptr) {
|
||||
source->process(app, source);
|
||||
}
|
||||
}
|
||||
|
||||
// 앱이 종료 요청되면 루프 탈출
|
||||
if (app->destroyRequested != 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
drawFrame(context);
|
||||
}
|
||||
|
||||
vkDeviceWaitIdle(context.device);
|
||||
cleanup(context);
|
||||
}
|
||||
|
||||
// --- 핵심 구현 (일부 함수는 개념만 설명) ---
|
||||
|
||||
void initVulkan(android_app* app, VulkanContext& context) {
|
||||
// 1. VkInstance 생성
|
||||
// 2. Validation Layer 설정 (디버그 빌드 시)
|
||||
// 3. VkSurfaceKHR 생성 (ANativeWindow로부터)
|
||||
// 4. VkPhysicalDevice 선택
|
||||
// 5. VkDevice 및 VkQueue 생성
|
||||
// 6. VkSwapchainKHR 생성
|
||||
// 7. VkImageView 생성
|
||||
// 8. VkRenderPass 생성
|
||||
// 9. VkCommandPool 생성
|
||||
// 10. VkFramebuffer 생성
|
||||
// 11. 동기화 객체(Semaphore, Fence) 생성
|
||||
// ... (Vulkan의 표준 초기화 절차)
|
||||
}
|
||||
|
||||
void createTextureImage(VulkanContext& context) {
|
||||
// 1. 텍스처 데이터 생성 (예: 2x2 흑백 체크무늬)
|
||||
uint8_t pixels[4 * 4] = {
|
||||
0, 0, 0, 255, // Black
|
||||
255, 255, 255, 255, // White
|
||||
255, 255, 255, 255, // White
|
||||
0, 0, 0, 255, // Black
|
||||
};
|
||||
VkDeviceSize imageSize = 4 * 4;
|
||||
int texWidth = 2, texHeight = 2;
|
||||
|
||||
// 2. Staging 버퍼 생성 및 데이터 복사
|
||||
VkBuffer stagingBuffer;
|
||||
VkDeviceMemory stagingBufferMemory;
|
||||
// ... createBuffer, allocateMemory, mapMemory, memcpy, unmapMemory ...
|
||||
|
||||
// 3. VkImage 생성 (VK_IMAGE_TILING_OPTIMAL, USAGE_TRANSFER_DST | USAGE_SAMPLED)
|
||||
// ... vkCreateImage ...
|
||||
|
||||
// 4. VkDeviceMemory 할당 및 바인딩
|
||||
// ... vkAllocateMemory, vkBindImageMemory ...
|
||||
|
||||
// 5. 이미지 레이아웃 변경 (UNDEFINED -> TRANSFER_DST_OPTIMAL)
|
||||
// ... transitionImageLayout ...
|
||||
|
||||
// 6. Staging 버퍼에서 VkImage로 데이터 복사
|
||||
// ... copyBufferToImage ...
|
||||
|
||||
// 7. 이미지 레이아웃 변경 (TRANSFER_DST_OPTIMAL -> SHADER_READ_ONLY_OPTIMAL)
|
||||
// ... transitionImageLayout ...
|
||||
|
||||
// 8. Staging 버퍼 정리
|
||||
vkDestroyBuffer(context.device, stagingBuffer, nullptr);
|
||||
vkFreeMemory(context.device, stagingBufferMemory, nullptr);
|
||||
|
||||
// 9. VkImageView 생성
|
||||
// ... vkCreateImageView ...
|
||||
|
||||
// 10. VkSampler 생성
|
||||
// ... vkCreateSampler ...
|
||||
}
|
||||
|
||||
void createGraphicsPipeline(VulkanContext& context, AAssetManager* assetManager) {
|
||||
auto vertShaderCode = readFile(assetManager, "shaders/shader.vert.spv"); // SPV로 사전 컴파일 필요
|
||||
auto fragShaderCode = readFile(assetManager, "shaders/shader.frag.spv");
|
||||
|
||||
// 1. 셰이더 모듈 생성
|
||||
// 2. Vertex Input State 설정 (Vertex 구조체에 맞게)
|
||||
// 3. Input Assembly, Viewport, Rasterizer, Multisample, DepthStencil, ColorBlend 상태 설정
|
||||
// 4. DescriptorSetLayout 생성 (Uniform Sampler를 위해)
|
||||
// 5. Pipeline Layout 생성
|
||||
// 6. VkGraphicsPipelineCreateInfo 채우기
|
||||
// 7. vkCreateGraphicsPipelines 호출
|
||||
// ... (Vulkan의 표준 파이프라인 생성 절차)
|
||||
}
|
||||
|
||||
void createDescriptorSets(VulkanContext& context) {
|
||||
// 1. VkDescriptorPool 생성 (Sampler 타입 1개)
|
||||
// 2. VkDescriptorSetAllocateInfo로 Descriptor Set 할당
|
||||
// 3. VkDescriptorImageInfo 설정 (textureImageView, textureSampler)
|
||||
// 4. VkWriteDescriptorSet 구조체 채우기
|
||||
// 5. vkUpdateDescriptorSets 호출하여 셰이더의 `texSampler`와 실제 텍스처를 연결
|
||||
}
|
||||
|
||||
void drawFrame(VulkanContext& context) {
|
||||
// 1. vkAcquireNextImageKHR로 스왑체인에서 렌더링할 이미지 인덱스 획득
|
||||
// 2. 현재 프레임의 Command Buffer 리셋
|
||||
// 3. Command Buffer 기록 시작 (vkBeginCommandBuffer)
|
||||
// 4. Render Pass 시작 (vkCmdBeginRenderPass)
|
||||
// 5. 그래픽 파이프라인 바인딩 (vkCmdBindPipeline)
|
||||
// 6. Vertex/Index 버퍼 바인딩
|
||||
// 7. Descriptor Set 바인딩 (vkCmdBindDescriptorSets)
|
||||
// 8. 드로우 콜 (vkCmdDrawIndexed)
|
||||
// 9. Render Pass 종료
|
||||
// 10. Command Buffer 기록 종료
|
||||
// 11. vkQueueSubmit으로 Command Buffer 제출 (동기화 Semaphore 포함)
|
||||
// 12. vkQueuePresentKHR으로 결과물을 화면에 표시
|
||||
}
|
||||
|
||||
// --- 유틸리티 함수 ---
|
||||
|
||||
std::vector<char> readFile(AAssetManager* assetManager, const std::string& filename) {
|
||||
AAsset* file = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_BUFFER);
|
||||
size_t fileLength = AAsset_getLength(file);
|
||||
std::vector<char> buffer(fileLength);
|
||||
AAsset_read(file, buffer.data(), fileLength);
|
||||
AAsset_close(file);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// ... 기타 필요한 유틸리티 함수들 (findMemoryType, createBuffer 등)
|
||||
```
|
||||
|
||||
## 6. 실행 방법
|
||||
|
||||
1. **GLSL 셰이더 컴파일:**
|
||||
Vulkan SDK에 포함된 `glslc` 컴파일러를 사용하여 `.vert`와 `.frag` 파일을 SPIR-V 형식(`.spv`)으로 컴파일해야 합니다.
|
||||
```bash
|
||||
glslc shaders/shader.vert -o app/src/main/assets/shaders/shader.vert.spv
|
||||
glslc shaders/shader.frag -o app/src/main/assets/shaders/shader.frag.spv
|
||||
```
|
||||
컴파일된 셰이더는 Android의 `assets` 폴더에 위치시켜 런타임에 `AAssetManager`로 읽을 수 있도록 합니다.
|
||||
|
||||
2. **Android Studio 프로젝트 빌드:**
|
||||
위 파일들을 포함하는 Android Studio 프로젝트를 생성하고 NDK를 설정한 후 빌드합니다. `main.cpp`의 생략된 부분(Vulkan 초기화, 리소스 생성/해제 등)을 상세히 구현해야 합니다.
|
||||
|
||||
3. **실행:**
|
||||
Vulkan을 지원하는 Android 기기나 에뮬레이터에서 앱을 실행하면, 화면 중앙에 흑백 체크무늬 텍스처가 입혀진 사각형이 나타납니다.
|
||||
|
||||
---
|
||||
|
||||
**참고:** 위 `main.cpp` 코드는 전체 구조와 핵심 로직을 보여주기 위한 의사 코드에 가깝습니다. Vulkan은 각 단계가 매우 상세하며 수많은 설정과 오류 처리가 필요합니다. 실제 구현 시에는 [Vulkan Tutorial](https://vulkan-tutorial.com/) 사이트나 Sascha Willems의 [Vulkan-Samples](https://github.com/SaschaWillems/Vulkan)를 참고하여 각 함수의 세부 내용을 채워야 합니다.
|
||||
Reference in New Issue
Block a user