Quick Flow
공유할 컨텍스트를 지정해 새 컨텍스트 생성
→ 작업 스레드에서 그 스레드의 현재 컨텍스트 설정
→ 자원 생성·업로드 → 완료 신호와 CPU 데이터 전달
→ 소비 컨텍스트에서 필요한 대기·재바인딩 → 사용한 컨텍스트를 동시에 여러 스레드의 현재 컨텍스트로 사용하지 않습니다. 객체 공유는 컨텍스트 전체 상태 공유도, 작업 완료 보장도 아닙니다.
공유 대상과 로컬 상태
텍스처·버퍼·프로그램 등은 공유 그룹에서 사용할 수 있습니다. VAO·FBO·program pipeline·transform feedback 객체와 query 객체는 공유하지 않습니다. 컨텍스트의 바인딩·viewport·깊이 상태도 별도로 유지합니다. 소비 컨텍스트는 자신이 사용할 VAO와 FBO 연결을 준비해야 합니다.
GLFW 3.4에서 두 번째 창 생성의 마지막 인수로 공유할 창을 전달합니다. 두 창의 API·플랫폼 호환 조건은 생성 단계에서 확인합니다.
GLFWwindow* second = glfwCreateWindow(320, 240, "Shared", nullptr, first);
if (!second) {
// 오류를 보고하고 first의 기존 작업은 유지할지 종료할지 결정합니다.
}이 코드는 first가 유효하고 GLFW를 초기화한 메인 스레드에서 실행하는 발췌입니다. GLFW 창 생성·이벤트 처리의 메인 스레드 제약과 GL 컨텍스트 현재화의 스레드 제약은 구분합니다.
컨텍스트 이동
같은 컨텍스트를 다른 스레드로 옮기려면 이전 스레드에서 현재 연결을 해제한 뒤 새 스레드에서 현재화합니다. CPU mutex로 객체 번호를 전달했다고 GPU 업로드까지 끝난 것은 아닙니다. producer가 fence를 만들고 명령을 제출한 뒤 consumer가 적절히 기다리는 등 GL 동기화를 별도로 구성합니다.
공유된 객체의 변경을 소비 컨텍스트에 반영할 때 필요한 바인딩·컨테이너 재연결과 명세의 가시성 조건도 확인합니다. 공유 buffer 이름 하나를 전달하고 어느 컨텍스트에서나 즉시 같은 VAO로 그릴 수 있다고 가정하지 않습니다.
현재 컨텍스트와 업로드 인계
컨텍스트를 다른 스레드로 이동할 때는 기존 소유 스레드에서 glfwMakeContextCurrent(nullptr)로 놓고, CPU 동기화로 그 완료를 전달한 뒤 새 스레드에서 glfwMakeContextCurrent(second)를 호출합니다. 동시에 두 스레드에서 현재화하지 않습니다. 창 생성·파괴와 GLFW 이벤트 처리는 GLFW의 메인 스레드 규칙을 따릅니다.
공유 컨텍스트에서 버퍼 하나를 업로드했다면 생산자·소비자의 GL 구간은 다음과 같습니다. 실제 스레드 생성·메시지 큐는 앱의 구조를 사용합니다. buffer와 ready를 전달할 CPU 큐는 release/acquire 또는 mutex 등으로 동기화하며, GLAD의 함수 진입점이 두 컨텍스트에 유효한 환경을 전제로 합니다.
// 생산자: 자신의 컨텍스트가 현재인 상태에서 저장소 업로드를 마친 뒤
GLsync ready = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
if (ready != nullptr) {
glFlush();
// 동기화된 CPU 큐로 (buffer, ready)를 소비자에게 넘깁니다.
}// 소비자: 큐에서 받은 유효한 ready, 자신의 컨텍스트가 현재인 상태
glWaitSync(ready, 0, GL_TIMEOUT_IGNORED);
glDeleteSync(ready);
glBindVertexArray(localVao);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr);
glEnableVertexAttribArray(0);소비자 VAO의 속성을 다시 연결하는 구간까지 보입니다. 생산자가 넘긴 fence의 소유권도 소비자에게 이전한 예이므로 생산자에서 먼저 삭제하지 않습니다. 양쪽에서 동시에 같은 저장소를 갱신하지 말고, 소비 종료 뒤 버퍼를 누가 삭제할지도 별도로 정합니다.
수명과 실패
작업 스레드가 아직 쓰는 자원을 렌더 스레드가 삭제하지 않도록 CPU 소유권과 GPU 사용 종료를 함께 관리합니다. 마지막 공유 컨텍스트의 종료와 자원 해제도 연결됩니다. 로더 함수 포인터·지원 정보가 모든 컨텍스트에서 동일하다고 무조건 캐시하지 않습니다.
컨텍스트가 필요 없는 이미지 디코딩·파일 읽기는 CPU 작업으로 처리할 수 있습니다. 업로드 병목이 확인되지 않은 작은 예제에 공유 컨텍스트를 필수 구조로 넣을 필요는 없습니다.
버전 경계
구형 플랫폼별 공유 API와 GLFW의 공유 인수는 GL 버전 번호와 별개의 창 시스템 기능입니다. 공유 가능한 객체 종류는 GL에 추가된 객체에 따라 달라집니다. GL 3.2 sync 또는 대응 확장은 컨텍스트 간 완료 조율에 사용할 수 있으며, 메모리 가시성과 완료 대기의 flush·wait 조건을 함께 봅니다.
참고 링크
4 sources