KR102006584B1 - 레이트 심도 테스팅과 컨서버티브 심도 테스팅 간의 동적 스위칭 - Google Patents
레이트 심도 테스팅과 컨서버티브 심도 테스팅 간의 동적 스위칭 Download PDFInfo
- Publication number
- KR102006584B1 KR102006584B1 KR1020187011331A KR20187011331A KR102006584B1 KR 102006584 B1 KR102006584 B1 KR 102006584B1 KR 1020187011331 A KR1020187011331 A KR 1020187011331A KR 20187011331 A KR20187011331 A KR 20187011331A KR 102006584 B1 KR102006584 B1 KR 102006584B1
- Authority
- KR
- South Korea
- Prior art keywords
- fragments
- fragment shader
- gpu
- shader program
- processing
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T7/00—Image analysis
- G06T7/20—Analysis of motion
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/60—Memory management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/50—Lighting effects
- G06T15/80—Shading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2200/00—Indexing scheme for image data processing or generation, in general
- G06T2200/04—Indexing scheme for image data processing or generation, in general involving 3D image data
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T2200/00—Indexing scheme for image data processing or generation, in general
- G06T2200/28—Indexing scheme for image data processing or generation, in general involving image processing hardware
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computer Graphics (AREA)
- Multimedia (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Image Generation (AREA)
- Image Processing (AREA)
Abstract
그래픽 프로세싱 유닛 (GPU) 은 GPU 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정할 수도 있다. GPU 는, 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교할 수도 있다. 프래그먼트 셰이더 프로그램의 작업부하가 특정 임계치보다 더 낮다고 결정하는 것에 응답하여, 프래그먼트 셰이더 프로그램은, 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅을 GPU 가 수행함이 없이 하나 이상의 프래그먼트들을 프로세싱할 수도 있다. GPU 는, 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에, 하나 이상의 비-폐색 프래그먼트들을 발생시키기 위해 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행할 수도 있다. GPU 는, 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입할 수도 있다.
Description
본 개시물은 그래픽 프로세싱에 관한 것이고, 보다 구체적으로는, 레이트 심도 프로세싱 (late depth processing) 과 컨서버티브 심도 프로세싱 (conservative depth processing) 간의 동적 스위칭에 관한 것이다.
컴퓨팅 디바이스의 그래픽 프로세싱 유닛 (graphics processing unit; GPU) 은 3차원 장면의 2차원 표현을 렌더링하기 위해 그래픽 지령 (command) 들을 프로세싱하는 복수의 스테이지들을 포함하는 그래픽 프로세싱 파이프라인을 실행할 수 있다. 3차원 장면은 정점들로 일반적으로 이루어지며, 그래픽 프로세싱 파이프라인은 3차원 장면의 2차원 표현을 렌더링하기 위해 3차원 장면에서의 각각의 정점 (vertex) 에 대해, 고정된 순서로 실행되는 스테이지들의 시리즈를 포함한다.
그래픽 프로세싱 파이프라인은 3차원 장면의 정점들을 변환하도록 실행하는 셰이더 스테이지들 (shader stages) 의 체인을 포함할 수도 있다. 셰이더 스테이지들의 각각은 이전 스테이지들에 의해 발생되는 데이터를 소비하고 다음 스테이지들에 대한 데이터를 발생시킨다. 그래픽 프로세싱 파이프라인은 프리미티브들 (primitives) 을 프래그먼트들로 래스터화하는 래스터화 스테이지 (rasterization stage) 를 포함할 수도 있다. 그래픽 프로세싱 파이프라인은 또한, 래스터화 스테이지에 의해 생성된 프래그먼트들의 프래그먼트 셰이딩을 수행하는, 래스터화 스테이지에 후속하는 프래그먼트 셰이더 스테이지를 포함할 수도 있다.
일반적으로, 이 개시물은, 트랜잭션 단위로, 그래픽 프로세싱 파이프라인의 래스터화 스테이지에 의해 생성된 프래그먼트들의 셋트에 대해 컨서버티브 심도 테스팅 (conservative depth testing) 을 수행할지 또는 레이트 심도 테스팅 (late depth testing) 을 수행할지 여부를 결정하기 위한 기법들을 기술한다.
본 개시의 하나의 예에서, 그래픽 프로세싱을 위한 방법은, 그래픽 프로세싱 유닛 (GPU) 에 의해, GPU 상에서 실행되는 프래그먼트 셰이더 프로그램 (fragment shader program) 의 작업부하 (workload) 를 결정하는 단계를 포함할 수도 있다. 방법, GPU 에 의해, 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교하는 단계를 더 포함할 수도 있다. 방법은, 프래그먼트 셰이더의 작업부하가 임계치보다 더 낮다고 결정하는 것에 응답하여, 프래그먼트 셰이더 프로그램에 의해, 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅 (early depth testing) 을 GPU 에 의해 수행함이 없이 하나 이상의 프래그먼트들을 프로세싱하는 단계를 더 포함할 수도 있다. 방법은, 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에 GPU 에 의해, 하나 이상의 비-폐색 프래그먼트들 (non-occluded fragments) 을 초래하기 위해 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하는 단계를 더 포함할 수도 있다. 방법은, GPU 에 의해, 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입하는 단계를 더 포함할 수도 있다.
본 개시의 다른 예에서, 그래픽 프로세싱을 위한 장치는, 하나 이상의 프래그먼트들을 저장하는 메모리를 포함할 수도 있다. 이 장치는, GPU 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정하고; 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교하며; 프래그먼트 셰이더 프로그램의 작업부하가 임계치보다 더 낮다고 결정하는 것에 응답하여, 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅을 GPU 에 의해 수행함이 없이 하나 이상의 프래그먼트들을 프래그먼트 셰이더 프로그램에 의해 프로세싱하고; 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에, 하나 이상의 비-폐색 프래그먼트들을 초래하기 위해 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하며; 그리고, 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입하도록 구성되는 그래픽 프로세싱 유닛 (GPU) 을 더 포함할 수도 있다.
본 개시의 또 다른 예에서, 그래픽 프로세싱을 위한 장치는, 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 수단을 포함할 수도 있다. 장치는, 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교하는 수단을 더 포함할 수도 있다. 장치는, 프래그먼트 셰이더 프로그램의 작업부하가 특정 임계치보다 더 낮다고 결정하는 것에 응답하여, 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이 하나 이상의 프래그먼트들을 프로세싱하는 수단을 더 포함할 수도 있다. 장치는, 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에, 하나 이상의 비-폐색 프래그먼트들을 초래하기 위해 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하는 수단을 더 포함할 수도 있다. 장치는, 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입하는 수단을 더 포함할 수도 있다.
본 개시의 또 다른 예에서, 컴퓨터-판독가능 저장 매체는, 명령들로서, 실행될 때, 하나 이상의 프로그래밍가능 프로세서들 (programmable processors) 로 하여금, 하나 이상의 프로그래밍가능 프로세서들 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정하게 하고; 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교하게 하며; 프래그먼트 셰이더 프로그램의 작업부하가 임계치보다 더 낮다고 결정하는 것에 응답하여, 하나 이상의 프로그래밍가능 프로세서들에 의해 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이, 프래그먼트 셰이더 프로그램에 의해, 하나 이상의 프래그먼트들을 프로세싱하게 하고; 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에, 하나 이상의 비-폐색 프래그먼트들을 초래하기 위해 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하게 하며; 그리고, 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입하게 하는 명령들을 저장할 수도 있다.
하나 이상의 예들의 세부 사항들이 첨부도면 및 아래의 상세한 설명에서 개시된다. 다른 특성들, 목적들, 및 이점들은 설명 및 도면들로부터, 그리고 청구항들로부터 명백히 알 수 있을 것이다.
도 1 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 이 개시의 하나 이상의 양태들을 구현하도록 구성될 수도 있는 예시적인 컴퓨팅 디바이스를 나타내는 블록도이다.
도 2 는 3차원 장면의 2차원 표현을 생성하기 위해 GPU 에 의해 수행될 수도 있는 예시적인 그래픽 프로세싱 파이프라인을 나타내는 블록도이다.
도 3 은 도 1 의 CPU, GPU, 및 시스템 메모리의 예시적인 구현들을 좀더 상세히 나타내는 블록도이다.
도 4 는 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
도 5 는 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
도 6 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한, 도 3 의 GPU 의 하드웨어 유닛들을 좀더 자세히 나타내는 블록도이다.
도 7 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
도 2 는 3차원 장면의 2차원 표현을 생성하기 위해 GPU 에 의해 수행될 수도 있는 예시적인 그래픽 프로세싱 파이프라인을 나타내는 블록도이다.
도 3 은 도 1 의 CPU, GPU, 및 시스템 메모리의 예시적인 구현들을 좀더 상세히 나타내는 블록도이다.
도 4 는 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
도 5 는 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
도 6 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한, 도 3 의 GPU 의 하드웨어 유닛들을 좀더 자세히 나타내는 블록도이다.
도 7 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다.
일반적으로, 이 개시물은, 트랜잭션 단위로, 그래픽 프로세싱 파이프라인의 래스터화 스테이지에 의해 생성된 프래그먼트들의 셋트에 대해 컨서버티브 심도 프로세싱을 수행할지 또는 레이트 심도 프로세싱을 수행할지 여부를 결정하기 위한 기법들을 기술한다. GPU 는 최종적으로 렌더링되는 장면에서의 뷰 (view) 로부터 프래그먼트들이 폐색되는지 여부를 결정하기 위해 프래그먼트들의 심도 프로세싱을 수행하고, 임의의 잠재적으로 폐색되는 프래그먼트들은 추가적인 프로세싱으로부터 생략한다. 이러한 방식으로, GPU 는 최종적으로 렌더링되는 장면에서 보이지 않을 프래그먼트들을 추가적으로 프로세싱하지 않음으로써 퍼포먼스 (performance) 를 향상시킬 수도 있다.
GPU 는 프래그먼트들의 셋트에 대해 조기 심도 테스팅 및 레이트 심도 테스팅 양자를 수행함으로써 래스터라이저 스테이지에 의해 생성된 프래그먼트들의 셋트에 대해 컨서버티브 심도 프로세싱을 수행할 수도 있다. 대안적으로, GPU 는 프래그먼트들의 셋트에 대해 레이트 심도 테스팅만을 수행함으로써 프래그먼트들의 셋트에 대해 레이트 심도 프로세싱을 수행할 수도 있다. 프래그먼트 셰이더는 프래그먼트들의 심도 값들을 잠재적으로 수정할 수도 있기 때문에, GPU 는 프래그먼트들의 셋트의 컨서버티브 심도 프로세싱 및 레이트 심도 프로세싱 양자 동안 레이트 심도 테스팅을 수행한다.
일부 경우들에서, 프래그먼트 셰이더가 무거운 작업부하를 가지는 경우에, GPU 는 조기 심도 테스팅을 통한 프래그먼트들을 프래그먼트 셰이더에 의해 프로세싱되는 것으로부터 잠재적으로 제거하기 위해 프래그먼트들의 컨서버티브 심도 프로세싱을 수행함으로써 그것의 퍼포먼스를 향상시킬 수도 있다. 다른 경우들에서, 프래그먼트 셰이더가 가벼운 작업부하를 가지는 경우에, 프래그먼트 셰이더가 그것의 가벼운 작업부하로 인해 프래그먼트들을 효율적으로 프로세싱할 수 있기 때문에, GPU 는 컨서버티브 심도 프로세싱 대신에 프래그먼트들의 레이트 심도 프로세싱을 수행하고 이에 의해 프래그먼트들의 조기 심도 테스팅을 생략함으로써 그것의 퍼포먼스를 향상시킬 수도 있다. 프래그먼트 셰이더의 작업부하가 하나의 클럭 사이클로부터 다른 클럭 사이클로 변경될 수 있기 때문에, GPU 는, 그래픽 프로세싱 파이프라인의 래스터화 스테이지에 의해 생성된 프래그먼트들에 대해 트랜잭션 단위로 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다.
GPU 는, 래스터라이저에 의해 생성된 프래그먼트들의 셋트의 각각의 트랜잭션에 대해, 프래그먼트들의 그 셋트에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있고, 트랜잭션 단위로 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱 간에 스위칭할 수도 있다. 일부 예들에서, 트랜잭션 (transaction) 은 단일 클럭 사이클에서 래스터라이저에 의해 생성된 프래그먼트들의 셋트일 수도 있다. 다른 예들에서, 트랜잭션은 일반적으로 래스터라이저에 의해 생성된 프래그먼트들의 셋트일 수도 있다. 단일 트랜잭션에서의 프래그먼트들의 셋트는 소프트웨어 애플리케이션에 의한 단일의 드로우 호출 (draw call) 을 프로세싱하는데서 발생할 수도 있는 프래그먼트들의 전부보다 더 적을 수도 있다.
GPU 는 프래그먼트들의 셋트의 프래그먼트 셰이딩을 수행하는 프래그먼트 셰이더의 작업부하, 및 프래그먼트들의 셋트의 심도 테스팅을 수행하는 심도 테스팅 하드웨어의 이용가능성에 기초하여 프래그먼트들의 주어진 셋트에 대해 컨서버티브 심도 프로세싱을 수행할지 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다. GPU 의 심도 테스트 유닛이 심도 테스팅을 수행하기 위해 이용가능할 때 컨서버티브 심도 프로세싱을 수행함으로써, GPU 는 그들 프래그먼트들의 프래그먼트 셰이딩을 수행하기 이전에 최종적으로 렌더링되는 장면에서 보이지 않는 프래그먼트들을 폐기할 수도 있고, 이에 의해, GPU 가 프래그먼트 셰이딩을 수행하는 프래그먼트들의 수를 최소화할 수도 있다. 또한, 프래그먼트 셰이더 프로그램이 가벼운 작업부하를 갖는 경우에 그들 프래그먼트들이 프래그먼트 셰이딩되기 전에 프래그먼트들에 대한 심도 테스트를 수행하는 것을 포함하지 않는 레이트 심도 프로세싱을 수행할 것을 결정함으로써, GPU 는 프래그먼트들이 프래그먼트 셰이딩될 때까지의 대기 시간을 최소화할 수도 있다. 이러한 방식으로, GPU 는, 프래그먼트들의 셋트에 대해, 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱이 그래픽 프로세싱 동작들을 수행함에 있어서 보다 큰 퍼포먼스를 제공하는지 여부를 결정함으로써, 최종적으로 렌더링되는 장면에서 보이지 않을 프래그먼트들을 보다 빨리 렌더링 (rendering) 할 수도 있다.
도 1 은 본 개시의 하나 이상의 양태들을 구현하도록 구성될 수도 있는 예시적인 컴퓨팅 디바이스를 예시하는 블록도이다. 도 1 에 나타낸 바와 같이, 디바이스 (2) 는 비디오 디바이스들, 미디어 플레이어들, 셋-탑 박스들, 무선 핸드셋들, 예컨대 모바일 전화기들 및 소위 스마트폰들, 개인 휴대정보 단말기들 (PDA들), 데스크탑 컴퓨터들, 랩탑 컴퓨터들, 게이밍 콘솔들, 화상 회의 유닛들, 태블릿 컴퓨팅 디바이스들 등을 포함하지만, 이에 한정되지 않는 컴퓨팅 디바이스일 수도 있다. 도 1 의 예에서, 디바이스 (2) 는 중앙 프로세싱 유닛 (CPU) (6), 시스템 메모리 (10), 및 GPU (12) 를 포함할 수도 있다 디바이스 (2) 는 또한 디스플레이 프로세서 (14), 송수신기 모듈 (3), 사용자 인터페이스 (4), 및 디스플레이 (8) 를 포함할 수도 있다. 송수신기 모듈 (3) 및 디스플레이 프로세서 (14) 는 양쪽다 CPU (6) 및/또는 GPU (12) 와 동일한 집적 회로 (IC) 의 부분일 수도 있거나, 양쪽다 CPU (6) 및/또는 GPU (12) 를 포함하는 IC 또는 IC들의 외부에 있을 수도 있거나, 또는 CPU (6) 및/또는 GPU (12) 를 포함하는 IC 의 외부에 있는 IC 에 형성될 수도 있다.
디바이스 (2) 는, 명료성의 목적들을 위해 도 1 에 미도시된 추가적인 모듈들 또는 유닛들을 포함할 수도 있다. 예를 들어, 디바이스 (2) 는 디바이스 (2) 가 모바일 무선 전화기 또는 스피커이거나 디바이스 (2) 가 미디어 플레이어인 예들에서 회선 통신들 (telephonic communications) 을 실시하기 위해 도 1 에 어느 것도 도시되지 않은 스피커 및 마이크로폰을 포함할 수도 있다. 디바이스 (2) 는 또한 비디오 카메라를 포함할 수도 있다. 더욱이, 디바이스 (2) 에 나타낸 여러 모듈들 및 유닛들은 디바이스 (2) 의 모든 예에서 필요하지 않을 수도 있다. 예를 들어, 사용자 인터페이스 (4) 및 디스플레이 (8) 는 디바이스 (2) 가 데스크탑 컴퓨터, 또는 외부 사용자 인터페이스 또는 디스플레이와 인터페이스하기 위해 탑재되는 다른 디바이스인 예들에서 디바이스 (2) 의 외부에 있을 수도 있다.
사용자 인터페이스 (4) 의 예들은 트랙볼, 마우스, 키보드, 및 다른 유형들의 입력 디바이스들을 포함하지만 이에 한정되지 않는다. 사용자 인터페이스 (4) 는 또한 터치 스크린일 수도 있으며, 디스플레이 (8) 의 일부분으로서 포함될 수도 있다. 송수신기 모듈 (3) 은 컴퓨팅 디바이스 (2) 와 또 다른 디바이스 또는 네트워크 사이에 무선 또는 유선 통신을 가능하게 하기 위해 회로를 포함할 수도 있다. 송수신기 모듈 (3) 은 변조기들, 복조기들, 증폭기들 및 유선 또는 무선 통신을 위한 이러한 다른 회로를 포함할 수도 있다.
CPU (6) 는 실행을 위한 컴퓨터 프로그램의 명령들을 프로세싱하도록 구성된 중앙 프로세싱 유닛 (CPU) 과 같은, 마이크로프로세서일 수도 있다. CPU (6) 는 컴퓨팅 디바이스 (2) 의 동작을 제어하는 범용 또는 특수-목적 프로세서를 포함할 수도 있다. 사용자는 CPU (6) 로 하여금 하나 이상의 소프트웨어 애플리케이션들을 실행하도록 하기 위해서 컴퓨팅 디바이스 (2) 에 입력을 제공할 수도 있다. CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은 예를 들어, 운영 시스템, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 스프레드 시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션 또는 또 다른 프로그램을 포함할 수도 있다. 게다가, CPU (6) 는 GPU (12) 의 동작을 제어하기 위해 GPU 드라이버 (22) 를 실행할 수도 있다. 사용자는 키보드, 마우스, 마이크로폰, 터치 패드 또는 컴퓨팅 디바이스 (2) 에 사용자 인터페이스 (4) 를 통해서 커플링된 다른 입력 디바이스와 같은 하나 이상의 입력 디바이스들 (미도시) 을 통해서 컴퓨팅 디바이스 (2) 에 입력을 제공할 수도 있다.
CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은 CPU (6) 에게 디스플레이 (8) 로의 그래픽 데이터의 렌더링을 발생시키도록 명령하는 하나 이상의 그래픽 렌더링 명령들을 포함할 수도 있다. 일부 예들에서, 소프트웨어 명령들은 예컨대, 개방 그래픽 라이브러리 (OpenGL®) API, OpenGL ES (Open Graphics Library Embedded Systems) API, Direct3D API, X3D API, RenderMan API, WebGL API, 또는 임의의 다른 공개 또는 독점 표준 그래픽 API 와 같은, 그래픽 애플리케이션 프로그래밍 인터페이스 (API) 를 따를 수도 있다. 그래픽 렌더링 명령들을 프로세싱하기 위해, CPU (6) 는 하나 이상의 그래픽 렌더링 지령들을 (예컨대, GPU 드라이버 (22) 를 통해서) GPU (12) 로 발하여, GPU (12) 로 하여금 그래픽 데이터의 렌더링의 일부 또는 모두를 수행하게 할 수도 있다. 일부 예들에서, 렌더링될 그래픽 데이터는 그래픽 프리미티브들의 리스트, 예컨대, 포인트들, 라인들, 삼각형들, 사변형들, 삼각형 스트립들, 등을 포함할 수도 있다.
GPU (12) 는 하나 이상의 그래픽 프리미티브들을 디스플레이 (8) 에 렌더링하는 그래픽 동작들을 수행하도록 구성될 수도 있다. 따라서, CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들 중 하나가 그래픽 프로세싱을 필요로 할 때, CPU (6) 는 디스플레이 (8) 에의 렌더링을 위해 그래픽 지령들 및 그래픽 데이터를 GPU (12) 에 제공할 수도 있다. 그래픽 데이터는 예컨대, 그리기 지령들, 상태 정보, 프리미티브 정보, 텍스쳐 정보, 등을 포함할 수도 있다. GPU (12) 는 일부 경우, CPU (6) 보다 좀더 효율적인 복합 그래픽 관련 동작들의 프로세싱을 제공하는 고속-병렬 구조 (highly-parallel structure) 로 형성될 수도 있다. 예를 들어, GPU (12) 는 다수의 정점들 또는 픽셀들에 대해 병렬 방식으로 동작하도록 구성되는, 셰이더 유닛들과 같은, 복수의 프로세싱 엘리먼트들을 포함할 수도 있다. GPU (12) 의 고속 병렬 성질은 일부 경우, GPU (12) 로 하여금, CPU (6) 를 이용하여 장면들을 디스플레이 (8) 에 직접 그리는 것 보다 더 빨리, 그래픽 이미지들 (예컨대, GUI들 및 2차원 (2D) 및/또는 3차원 (3D) 그래픽 장면들) 을 디스플레이 (8) 상에 그리는 것을 가능하게 할 수도 있다.
GPU (12) 는 일부 경우, 컴퓨팅 디바이스 (2) 의 마더보더에 통합될 수도 있다. 다른 경우, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보더에서의 포트에 설치된 그래픽 카드 상에 존재할 수도 있거나 또는 아니면, 컴퓨팅 디바이스 (2) 와 상호운용하도록 구성된 주변장치 디바이스 내에 통합될 수도 있다. CPU (6) 및 GPU (12) 는 또한 시스템 온 칩 (SoC) 과 같은 단일 패키지의 일부일 수도 있다. GPU (12) 는 하나 이상의 마이크로프로세서들, 주문형 집적회로들 (ASIC들), 필드 프로그래밍가능 게이트 어레이들 (FPGA들), 디지털 신호 프로세서들 (DSP들), 또는 다른 등가의 통합 또는 이산 로직 회로와 같은, 하나 이상의 프로세서들을 포함할 수도 있다. GPU (12) 는 또한 하나 이상의 프로세서 코어들을 포함할 수도 있으며, 따라서 GPU (12) 가 멀티-코어 프로세서로서 지칭될 수도 있다.
GPU (12) 는 그래픽 메모리 (40) 에 직접 커플링될 수도 있다. 따라서, GPU (12) 는 버스를 이용하지 않고 그래픽 메모리 (40) 로부터 데이터를 판독하고 그래픽 메모리 (14) 에 데이터를 기록할 수도 있다. 즉, GPU (12) 는 오프-칩 메모리 대신, 로컬 스토리지를 이용하여, 데이터를 로컬로 프로세싱할 수도 있다. 이러한 그래픽 메모리 (40) 는 온칩 메모리로서 지칭될 수도 있다. 이것은 막대한 버스 트래픽을 겪을 수도 있는, GPU (12) 가 버스를 통해서 데이터를 판독하고 기록할 필요성을 제거함으로써, GPU (12) 로 하여금 좀더 효율적인 방법으로 동작가능하게 한다. 일부의 경우, 그러나, GPU (12) 는 별개의 메모리를 포함하지 않고, 대신 버스를 통해서 시스템 메모리 (10) 를 이용할 수도 있다. 그래픽 메모리 (40) 는 예컨대, 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 소거가능한 프로그래밍가능 ROM (EPROM), 전기적 소거가능한 프로그래밍가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체들 또는 광학 저장 매체들과 같은, 하나 이상의 휘발성 또는 비-휘발성 메모리들 또는 저장 디바이스들을 포함할 수도 있다.
일부 예들에서, GPU (12) 는 완전히 형성된 이미지를 시스템 메모리 (10) 에 저장할 수도 있다. 디스플레이 프로세서 (14) 는 시스템 메모리 (10) 로부터 이미지를 취출하고 디스플레이 (8) 의 픽셀들로 하여금 이미지를 디스플레이하기 위해 조사하도록 하는 값들을 출력할 수도 있다. 디스플레이 (8) 는 GPU (12) 에 의해 발생되는 이미지 콘텐츠를 디스플레이하는 컴퓨팅 디바이스 (2) 의 디스플레이일 수도 있다. 디스플레이 (8) 는 액정 디스플레이 (LCD), 유기 발광 다이오드 디스플레이 (OLED), 음극선관 (CRT) 디스플레이, 플라즈마 디스플레이, 또는 다른 유형의 디스플레이 디바이스일 수도 있다.
본 개시의 양태들에 따르면, GPU (12) 는 GPU (12) 상에서 실행되는 프래그먼트 셰이더의 작업부하를 결정할 수도 있다. 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 낮은 것을 결정하는 것에 응답하여, 프래그먼트 셰이더가 하나 이상의 프래그먼트들을 프로세싱하기 이전에 GPU (12) 가 그 하나 이상의 프래그먼트들의 심도 테스팅을 수행하는 일 없이 프래그먼트 셰이더는 그 하나 이상의 프래그먼트들을 프로세싱할 수도 있다.
도 2 는 3차원 장면의 2차원 표현을 생성하기 위해 GPU (12) 에 의해 수행될 수도 있는 예시적인 그래픽 프로세싱 파이프라인 (24) 을 예시하는 블록도이다. 그래픽 프로세싱 파이프라인 (24) 은 그래픽 프로세싱 지령들을 실행하기 위해 함께 동작하는 복수의 그래픽 프로세싱 스테이지들을 포함할 수도 있다. 도 2 에 나타낸 바와 같이, 그래픽 프로세싱 파이프라인 (24) 은 지령 엔진 (26), 정점 셰이더 스테이지 (28), 테셀레이션 스테이지들 (30), 지오메트리 프로세싱 스테이지 (32), 래스터화 스테이지 (34), 및 프래그먼트 셰이더 스테이지 (36) 를 포함할 수도 있다. 그래픽 프로세싱 파이프라인 (24) 에서의 구성요소들의 각각은 고정-기능 구성요소들로서, 프로그래밍가능 구성요소들로서 (예컨대, 프로그래밍가능 셰이더 유닛 상에서 실행하는 셰이더 프로그램의 일부로서), 또는 고정-기능 구성요소들과 프로그래밍가능 구성요소들의 조합으로서 구현될 수도 있다.
GPU (12) 는 CPU (6) 로부터, GPU 드라이버 (22) 를 통해서, 하나 이상의 그래픽 프로세싱 지령들을 수신하고 그래픽 프로세싱 지령들을 그래픽 프로세싱 파이프라인 (24) 을 통해서 실행하여 디스플레이가능한 그래픽 이미지들을 발생시키도록 구성될 수도 있다. 위에서 설명한 바와 같이, 그래픽 프로세싱 파이프라인 (24) 은 그래픽 프로세싱 지령들을 실행하기 위해 함께 동작하는 복수의 스테이지들을 포함한다. 하지만, 이러한 스테이지들은 반드시 별개의 하드웨어 블록들로 구현될 필요는 없음에 유의하여야 한다. 예를 들어, 정점 셰이더 스테이지 (28), 테셀레이션 스테이지들 (30), 지오메트리 프로세싱 스테이지 (32), 래스터화 스테이지 (34), 및 프래그먼트 셰이더 스테이지 (36) 는 하나로 된 셰이더 유닛의 일부로서 구현될 수도 있다.
지령 엔진 (26) 은 그래픽 프로세싱 지령들을 수신하고, 그 그래픽 프로세싱 지령들을 실행하기 위한 다양한 동작들을 수행하기 위해 그래픽 프로세싱 파이프라인 (24) 내의 나머지 프로세싱 스테이지들을 구성할 수도 있다. 그래픽 프로세싱 지령들은, 예를 들어, 드로잉 지령들 및 그래픽 상태 지령들을 포함할 수도 있다. 드로잉 지령들은 하나 이상의 정점들에 대해 위치적 좌표들을 명시하는 정점 명시 지령들 및, 일부 경우들에서, 컬러 좌표들, 정규 벡터들, 텍스처 좌표들 및 포그 좌표들과 같은, 정점들의 각각과 연관된 다른 속성 값들을 포함할 수도 있다. 그래픽 상태 명령들은 프리미티브 타입 지령들, 변환 지령들, 라이팅 지령들 등을 포함할 수도 있다. 프리미티브 타입 지령들은 렌더링될 프리미티브의 타입 및/또는 프리미티브를 형성하기 위해 정점들이 어떻게 결합되는지를 명시할 수도 있다. 변환 지령들은 정점들 상에서 수행할 변환들의 타입들을 명시할 수도 있다. 라이팅 지령들은 그래픽 장면 내의 상이한 광들의 타입, 방향 및/또는 배치를 명시할 수도 있다. 지령 엔진 (26) 은 지오메트리 프로세싱 스테이지 (32) 로 하여금 하나 이상의 수신된 지령들과 연관된 정점들 및/또는 프리미티브들에 대해 지오메트리 프로세싱을 수행하게 할 수도 있다.
정점 셰이더 스테이지 (28) 는 수신된 정점 데이터 및 속성들을 프로세싱할 수도 있다. 예를 들어, 정점 셰이더 스테이지 (28) 는 변환들, 스키닝 (skinning), 정점 변위, 및 정점-당 재료 속성들을 계산하는 것과 같은, 정점-당 프로세싱을 수행할 수도 있다. 일부 예들에서, 정점 셰이더 스테이지 (28) 는 텍스쳐 좌표들, 정점 칼라, 정점 조명, 안개 인자들 등을 발생시킬 수도 있다. 정점 셰이더 스테이지 (28) 는 일반적으로 단일 입력 정점을 취하고, 단일, 프로세싱된 출력 정점을 출력한다.
테셀레이션 스테이지들 (30) 은 정점 셰이더 스테이지 (28) 에 의해 출력되는 정점들을 수신하고, 저-상세 하위분할 표면들을 고-상세 프리미티브들로 변환하고 고차 표면들을 렌더링을 위해 적합한 표면들 (예컨대, 삼각형들) 로 묶는 그래픽 프로세싱 파이프라인 (24) 의 선택적 스테이지들의 셋트일 수도 있다.
지오메트리 프로세싱 스테이지 (32) 는 래스터화 스테이지 (34) 에 대한 프리미티브 데이터를 생성하기 위해 정점 셰이더 스테이지 (28) 또는 테셀레이션 스테이지들 (30) 에 의해 출력되는 하나 이상의 정점들에 대해 정점 당 동작들 및/또는 프리미티브 셋업 동작들을 수행할 수도 있다. 각 정점은 예컨대 위치적 좌표들, 컬러 값들, 정규 벡터, 및 텍스처 좌표들과 같은 속성들의 셋트와 연관될 수도 있다. 지오메트리 프로세싱 스테이지 (32) 는 다양한 정점 당 동작들에 따라 이들 속성들 중 하나 이상을 수정한다. 예를 들어, 지오메트리 프로세싱 스테이지 (32) 는 수정된 정점 위치 좌표들을 생성하기 위해 정점 위치 좌표들에 대해 하나 이상의 변환들을 수행할 수도 있다. 지오메트리 프로세싱 스테이지 (32) 는, 예를 들어, 수정된 정점 위치 좌표들을 생성하기 위해 정점 위치 좌표들에 대해 모델링 변환, 뷰잉 변환, 투영 변환, 모델뷰 변환, 모델뷰투영 변환, 뷰포트 변환 및 심도 범위 스케일링 변환 중 하나 이상을 적용할 수도 있다. 일부 경우들에서, 정점 위치 좌표들은 모델 공간 좌표들일 수도 있고, 수정된 정점 위치 좌표들은 스크린 공간 좌표들일 수도 있다. 스크린 공간 좌표들은 모델링, 뷰잉, 투영 및 뷰포트 변환의 적용 후에 획득될 수도 있다. 일부 경우들에서, 지오메트리 프로세싱 스테이지 (32) 는 또한, 정점들에 대해 수정된 컬러 좌표들을 생성하기 위해 정점들에 대해 정점 당 라이팅 동작들을 수행할 수도 있다. 지오메트리 프로세싱 스테이지 (32)는 또한, 예컨대, 정규 변환들, 정규 정규화 변환들, 뷰 볼륨 클립핑, 동종 분할 및/또는 백페이스 컬링 동작들을 포함하는 다른 동작들을 수행할 수도 있다.
지오메트리 프로세싱 스테이지 (32) 는, 래스터화될 프리미티브를 정의하는 하나 이상의 수정된 정점들의 셋트, 및 프리미티브를 형성하기 위해 정점들이 어떻게 결합할지를 명시하는 데이터를 포함하는 프리미티브 데이터를 생성할 수도 있다. 수정된 정점들의 각각은, 예를 들어, 수정된 정점 위치 좌표들, 및 정점과 연관된 프로세싱된 정점 속성 값들을 포함할 수도 있다. 프리미티브 데이터는 그래픽 프로세싱 파이프라인 (24) 의 추가적인 스테이지들에 의해 래스터화될 프리미티브에 집합적으로 대응할 수도 있다. 개념적으로, 각각의 정점은 프리미티브의 2 개의 에지들이 만나는 프리미티브의 코너에 대응할 수도 있다. 지오메트리 프로세싱 스테이지 (32) 는 추가적인 프로세싱을 위해 래스터화 스테이지 (34) 에 프리미티브 데이터를 제공할 수도 있다.
일부 예들에서, 지오메트리 프로세싱 스테이지 (32) 의 전부 또는 일부는 GPU (12) 의 하나 이상의 셰이더 프로세서들 상에서 실행되는 하나 이상의 셰이더 프로그램들에 의해 구현될 수도 있다. 예를 들어, 지오메트리 프로세싱 스테이지 (32) 는, 이러한 예들에서, 정점 셰이더, 지오메트리 셰이더 또는 이들의 임의의 조합에 의해 구현될 수도 있다. 다른 예들에서, 지오메트리 프로세싱 스테이지 (32) 는 고정-기능 하드웨어 프로세싱 파이프라인으로서 또는 하나 이상의 셰이더 유닛들 상에서 실행되는 하나 이상의 셰이더 프로그램들 및 고정-기능 하드웨어의 조합으로서 구현될 수도 있다.
래스터화 스테이지 (34) 는, 지오메트리 프로세싱 스테이지 (32) 로부터, 래스터화된 프리미티브에 대응하는 복수의 소스 픽셀들을 생성하기 위해 프리미티브를 래스터화하기 위해 그리고 래스터화될 프리미티브를 나타내는 프리미티브 데이터를 수신하도록 구성된다. 일부 예들에서, 래스터화 스테이지 (34) 는 어느 스크린 픽셀 로케이션들이 래스터화될 프리미티브에 의해 커버되는지를 결정할 수도 있고, 프리미티브에 의해 커버될 결정된 각각의 스크린 픽셀 로케이션에 대해 소스 픽셀을 생성할 수도 있다. 래스터화 스테이지 (34) 는, 예컨대, 에지-워킹 기법, 에지 방정식들 평가 등과 같이, 당해 기술분야에서 통상의 지식을 가진 자 (이하, '통상의 기술자' 라 함) 에게 알려진 기법들을 이용하여 프리미티브에 의해 어느 스크린 픽셀 로케이션들이 커버되는지를 결정할 수도 있다. 래스터화 스테이지 (34) 는 결과적인 소스 픽셀들을 추가적인 프로세싱을 위해 프래그먼트 셰이더 스테이지 (36) 에 제공할 수도 있다.
래스터화 스테이지 (34) 에 의해 생성된 소스 픽셀들은 스크린 픽셀 로케이션, 예컨대, 목적지 픽셀에 대응할 수도 있고, 하나 이상의 컬러 속성들과 연관될 수도 있다. 특정 래스터화된 프리미티브에 대해 생성된 소스 픽셀들의 전부는 래스터화된 프리미티브와 연관된다고 말할 수도 있다. 프리미티브에 의해 커버되는 것으로 래스터화 스테이지 (34) 에 의해 결정되는 픽셀들은 개념적으로, 프리미티브의 정점들을 나타내는 픽셀들, 프리미티브의 에지들을 나타내는 픽셀들 및 프리미티브의 내부를 나타내는 픽셀들을 포함할 수도 있다.
프래그먼트 셰이더 스테이지 (36) 는 래스터화된 프리미티브와 연관된 소스 픽셀을 수신하도록, 그리고, 소스 픽셀에 대해 하나 이상의 픽셀 당 동작들을 수행하도록 구성된다. 프래그먼트 셰이더 스테이지 (36) 에 의해 수행될 수도 있는 픽셀 당 동작들은, 예컨대, 알파 테스트, 텍스처 맵핑, 컬러 계산, 픽셀 셰이딩, 픽셀 당 라이팅, 포그 프로세싱, 블렌딩, 픽셀 소유권 텍스트, 소스 알파 테스트, 스텐실 테스트, 심도 테스트, 시저스 테스트 및/또는 점묘 동작들을 포함한다. 또한, 프래그먼트 셰이더 스테이지 (36) 는 하나 이상의 픽셀 당 동작들을 수행하기 위해 하나 이상의 프래그먼트 셰이더 프로그램들을 실행할 수도 있다. 프래그먼트 셰이더 스테이지 (36) 에 의해 생성된 결과적인 데이터는 본 명세서에서 목적지 픽셀 데이터로서 지칭되고 프레임 버퍼에 저장될 수도 있다. 목적지 픽셀 데이터는 프로세싱되었던 소스 픽셀과 동일한 디스플레이 로케이션을 갖는 프레임 버퍼에서의 목적지 픽셀과 연관될 수도 있다. 목적지 픽셀 데이터는 예컨대, 컬러 값들, 목적지 알파 값들, 심도 값들 등과 같은 데이터를 포함할 수도 있다.
본 개시의 일 양태에 따르면, GPU (12) 는 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 GPU (12) 를 실행하는 프래그먼트 셰이더의 작업부하를 결정할 수도 있다. 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 낮다고 결정하는 것에 응답하여, 프래그먼트 셰이더는, 프래그먼트 셰이더가 하나 이상의 프래그먼트들을 프로세싱하기 이전에 GPU (12) 가 하나 이상의 프래그먼트들의 심도 테스팅을 수행하는 일 없이, 하나 이상의 프래그먼트들을 프로세싱할 수도 있다.
도 3 은 도 1 의 CPU (6), GPU (12), 및 시스템 메모리 (10) 의 예시적인 구현예들을 좀더 상세히 예시하는 블록도이다. 도 3 에 나타낸 바와 같이, CPU (6) 는 적어도 하나의 소프트웨어 애플리케이션 (18), 그래픽 API (20), 및 GPU 드라이버 (22) 를 포함할 수도 있으며, 이들 각각은 CPU (6) 상에서 실행하는 하나 이상의 소프트웨어 애플리케이션들 또는 서비스들일 수도 있다.
CPU (6) 및 GPU (12) 에 이용가능한 메모리는 시스템 메모리 (10) 및 프레임 버퍼 (16) 를 포함할 수도 있다. 프레임 버퍼 (16) 는 시스템 메모리 (10) 의 일부분일 수도 있거나 또는 시스템 메모리 (10) 로부터 분리될 수도 있다. 프레임 버퍼 (16) 는 렌더링된 이미지 데이터를 저장할 수도 있다.
소프트웨어 애플리케이션 (18) 은 GPU (12) 의 기능을 이용하는 임의의 애플리케이션일 수도 있다. 예를 들어, 소프트웨어 애플리케이션 (18) 은 GUI 애플리케이션, 운영 시스템, 휴대형 맵핑 애플리케이션, 엔지니어링 또는 예술적 애플리케이션들을 위한 컴퓨터 지원 설계 프로그램, 비디오 게임 애플리케이션, 또는 2D 또는 3D 그래픽를 이용하는 또다른 유형의 소프트웨어 애플리케이션일 수도 있다.
소프트웨어 애플리케이션 (18) 은 GPU (12) 에게 그래픽 사용자 인터페이스 (GUI) 및/또는 그래픽 장면을 렌더링하도록 명령하는 하나 이상의 그리기 명령들을 포함할 수도 있다. 예를 들어, 그리기 명령들은 GPU (12) 에 의해 렌더링될 하나 이상의 그래픽 프리미티브들의 셋트를 정의하는 명령들을 포함할 수도 있다. 일부 예들에서, 그리기 명령들은 일괄하여, GUI 에 사용되는 복수의 윈도우잉 표면들의 모두 또는 일부를 정의할 수도 있다. 추가적인 예들에서, 그리기 명령들은 일괄하여, 애플리케이션에 의해 정의되는 모델 공간 또는 세계 공간 내에 하나 이상의 그래픽 오브젝트들을 포함하는 그래픽 장면의 모두 또는 일부를 정의할 수도 있다.
소프트웨어 애플리케이션 (18) 은 하나 이상의 그래픽 프리미티브들을 디스플레이가능한 그래픽 이미지들로 렌더링하기 위해, 그래픽 API (20) 를 통해서, GPU 드라이버 (22) 를 호출하여, 하나 이상의 지령들을 GPU (12) 로 발할 수도 있다. 예를 들어, 소프트웨어 애플리케이션 (18) 은 그래픽 API (20) 를 통해서, GPU 드라이버 (22) 를 호출하여, 프리미티브 정의들을 GPU (12) 에 제공할 수도 있다. 일부의 경우, 프리미티브 정의들은 GPU (12) 에 그리기 프리미티브들의 리스트의 유형, 예컨대, 삼각형들, 직사각형들, 삼각형 팬들, 삼각형 스트립들, 등으로 제공될 수도 있다. 프리미티브 정의들은 렌더링될 프리미티브들과 연관되는 하나 이상의 정점들을 규정하는 정점 사양들을 포함할 수도 있다. 정점 사양들은 각각의 정점에 대한 위치 좌표들 및, 일부 경우, 정점과 연관되는 다른 속성들, 이를 테면 예컨대, 칼라 좌표들, 법선 벡터들, 및 텍스쳐 좌표들을 포함할 수도 있다. 프리미티브 정의들은 또한 프리미티브 유형 정보 (예컨대, 삼각형, 직사각형, 삼각형 팬 (triangle fan), 삼각형 스트립, 등), 스케일링 정보, 회전 정보 등을 포함할 수도 있다. 소프트웨어 애플리케이션 (18) 에 의해 GPU 드라이버 (22) 로 발해진 명령들에 기초하여, GPU 드라이버 (22) 는 프리미티브를 렌더링하기 위해 수행할 GPU (12) 에 대한 하나 이상의 동작들을 규정하는 하나 이상의 지령들을 형성할 수도 있다. GPU (12) 가 CPU (6) 로부터 지령을 수신할 때, 프로세서 클러스터 (46) 는 그 지령을 디코딩하기 위해 그래픽 프로세싱 파이프라인 (24) 을 실행할 수도 있고, 그 지령에 규정된 동작을 수행하도록 그래픽 프로세싱 파이프라인 (24) 을 구성한다. 예를 들어, 그래픽 프로세싱 파이프라인 (24) 에서의 지령 엔진 (26) 은 프리미티브 데이터를 판독하고 그래픽 프로세싱 파이프라인 (24) 에서 다른 그래픽 파이프라인 스테이지들에 의한 사용을 위해 그 데이터를 프리미티브들로 조립할 수도 있다. 규정된 동작들을 수행한 후, 그래픽 프로세싱 파이프라인 (24) 은 렌더링된 데이터를 디스플레이 디바이스와 연관되는 프레임 버퍼 (16) 로 출력한다.
프레임 버퍼 (16) 는 GPU (12) 에 대한 목적지 픽셀들을 저장한다. 각각의 목적지 픽셀은 고유한 스크린 픽셀 로케이션과 연관될 수도 있다. 일부 예들에서, 프레임 버퍼 (16) 는 각각의 목적지 픽셀에 대한 칼라 성분들 및 목적지 알파 (alpha) 값을 저장할 수도 있다. 예를 들어, 프레임 버퍼 (16) 는 각각의 픽셀에 대해 적색, 녹색, 청색, 알파 (RGBA) 성분들을 저장할 수도 있으며, 여기서, "RGB" 성분들은 칼라 값들에 대응하며 "A" 성분은 목적지 알파 값에 대응한다. 프레임 버퍼 (16) 는 또한 각각의 목적지 픽셀에 대한 심도 값들을 저장할 수도 있다. 프레임 버퍼 (16) 및 시스템 메모리 (10) 는 별개의 메모리 유닛들인 것으로 예시되지만, 다른 예들에서, 프레임 버퍼 (16) 는 시스템 메모리 (10) 의 일부일 수도 있다.
프로세서 클러스터 (46) 는 하나 이상의 프로그래밍가능 프로세싱 유닛들 (42) 및/또는 하나 이상의 고정 기능 프로세싱 유닛들 (44) 을 포함할 수도 있다. 프로그래밍가능 프로세싱 유닛들 (42) 은, 예를 들어, CPU (6) 로부터 GPU (12) 상으로 다운로드되는 하나 이상의 셰이더 프로그램들을 실행하도록 구성되는 프로그래밍가능 셰이더 유닛들을 포함할 수도 있다. 일부 예들에서, 프로그래밍가능 프로세싱 유닛들 (42) 은 "셰이더 프로세서들" 또는 "하나로 된 셰이더들" 로서 지칭될 수도 있고, 그래픽을 렌더링하기 위해 지오메트리, 정점, 픽셀, 또는 다른 셰이딩 동작들을 수행할 수도 있다. 셰이더 유닛들은 각각, 동작들을 페칭 및 디코딩하기 위한 하나 이상의 컴포넌트들, 산술적 계산들을 수행하기 위한 하나 이상의 ALU 들, 하나 이상의 메모리들, 캐시들, 및 레지스터들을 포함할 수도 있다.
셰이더 프로그램은, 일부 예들에서, 예컨대 OpenGL 셰이딩 언어 (OpenGL Shading Language; GLSL), 하이 레벨 셰이딩 언어 (High Level Shading Language; HLSL), 그래픽용 C (C for Graphics; Cg) 셰이딩 언어 등과 같은 하이-레벨 셰이딩 언어로 쓰여진 프로그램의 컴파일링된 버전일 수도 있다. 일부 예들에서, 프로그래밍가능 프로세싱 유닛들 (42) 은 예컨대 SIMD 와 같이 병렬적으로 동작하도록 구성되는 복수의 프로세싱 유닛들을 포함할 수도 있다. 프로그래밍가능 프로세싱 유닛들 (42) 은, 셰이더 프로그램 명령들을 저장하는 프로그램 메모리, 및 실행 상태 레지스터, 예컨대, 프로그램 메모리에서의 현재 명령이 실행되고 있거나 다음 명령들이 페치될 것이라는 것을 나타낸느 프로그램 카운터 레지스터를 가질 수도 있다. 프로세서 클러스터 (46) 에서의 프로그래밍가능 프로세싱 유닛들 (42) 은, 예를 들어, 정점 셰이더 유닛들, 프래그먼트 셰이더 유닛들, 지오메트리 셰이더 유닛들, 헐 (hull) 셰이더 유닛들, 도메인 셰이더 유닛들, 컴퓨트 셰이더 유닛들, 및/또는 하나로된 셰이더 유닛들을 포함할 수도 있다.
GPU (12) 는 그래픽 프로세싱 파이프라인 (24) 에서의 정점 셰이더 스테이지 (28), 테셀레이션 스테이지들 (30), 지오메트리 프로세싱 스테이지 (32), 래스터화 스테이지 (34), 및 프래그먼트 셰이더 스테이지 (36) 를 실행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 에 지령들을 전송함으로써, 정점 셰이딩, 헐 셰이딩, 도메인 셰이딩, 지오메트리 셰이딩, 프래그먼트 셰이딩 등과 같은 다양한 셰이딩 동작들을 수행하도록 프로그래밍가능 프로세싱 유닛들 (42) 을 지정할 수도 있다. 일부 예들에서, GPU 드라이버 (22) 는 CPU (6) 상에서 실행되는 컴파일러로 하여금 하나 이상의 셰이더 프로그램들을 컴파일링하게 하고, 컴파일링된 셰이더 프로그램들을 GPU (12) 내에 포함된 프로그래밍가능 프로세싱 유닛들 (42) 상으로 다운로드하게 할 수도 있다. 셰이더 프로그램들은, 예컨대 OpenGL 셰이딩 언어 (GLSL), 하이 레벨 셰이딩 언어 (HLSL), 그래픽용 C (Cg) 셰이딩 언어, OpenCL C 커널 등과 같은 하이-레벨 셰이딩 언어로 쓰여질 수도 있다. 컴파일링된 셰이더 프로그램들은 GPU (12) 내의 프로그래밍가능 프로세싱 유닛들 (42) 의 동작을 제어하는 하나 이상의 명령들을 포함할 수도 있다. 예를 들어, 셰이더 프로그램들은, 정점 셰이더 스테이지 (28) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 에 의해 실행될 수도 있는 정점 셰이더 프로그램들, 테셀레이션 스테이지들 (30) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 에 의해 실행될 수도 있는 테셀레이션 셰이더 프로그램들, 지오메트리 프로세싱 스테이지 (32) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 에 의해 실행될 수도 있는 지오메트리 셰이더 프로그램들 및/또는 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 에 의해 실행될 수도 있는 프래그먼트 셰이더 프로그램들을 포함할 수도 있다. 정점 셰이더 프로그램은 프로그래밍가능 정점 셰이더 유닛 또는 하나로된 셰이더 유닛의 실행을 제어할 수도 있고, 하나 이상의 정점 당 동작들을 명시하는 명령들을 포함할 수도 있다.
프로세서 클러스터 (46) 는 또한, 고정 기능 프로세싱 유닛 (44) 을 포함할 수도 있다. 고정 기능 프로세싱 유닛 (44) 은 어떤 기능들을 수행하도록 하드-와이어링된 하드웨어를 포함할 수도 있다. 비록 고정 기능 프로세싱 유닛 (44) 은, 다른 기능들을 수행하기 위해, 예를 들어 하나 이상의 제어 신호들을 통해, 제어가능할 수도 있지만, 고정 기능 하드웨어는 통상적으로 사용자-컴파일링된 프로그램들을 수신할 수 있는 프로그램 메모리를 포함하지 않는다. 일부 예들에서, 프로세서 클러스터 (46) 에서의 고정 기능 프로세싱 유닛 (44) 은, 예를 들어, 그래픽 프로세싱 파이프라인 (24) 의 래스터화 스테이지 (34) 의 기능들을 수행하도록, 예컨대, 심도 테스팅, 시저스 테스팅, 알파 블렌딩 등과 같은 래스터 동작들을 수행하는 프로세싱 유닛들을 예컨대 포함할 수도 있다.
그래픽 메모리 (40) 는 GPU (12) 의 집적 회로 내로 물리적으로 통합되는 온-칩 스토리지 또는 메모리이다. 그래픽 메모리 (40) 가 온-칩이기 때문에, GPU (12) 는 또한, 시스템 버스를 통해 시스템 메모리 (10) 로부터 값들을 읽거나 시스템 메모리 (10) 에 값들을 쓰는 것보다 더 빨리 그래픽 메모리 (40) 로부터 값들을 읽거나 그래픽 메모리 (40) 에 값들을 쓰는 것이 가능할 수도 있다. 그래픽 메모리 (40) 는 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램에 의해 프로세싱을 위해 프래그먼트들을 저장 및 큐잉하도록 구성되는 셰이더 입력 버퍼 (50) 를 포함할 수도 있다.
상기 논의된 바와 같이, 프로세서 클러스터 (46) 는, 그래픽 프로세싱 파이프라인 (24) 의 다양한 스테이지들의 기능들을 수행할 수도 있는 고정 기능 프로세싱 유닛 (44) 및 프로그래밍가능 프로세싱 유닛들 (42) 을 포함한다. 하나의 예에서, 프로세서 클러스터 (46) 의 고정 기능 프로세싱 유닛 (44) 은 하나 이상의 프리미티브들을 픽셀들의 셋트 내로 래스터화하기 위해 래스터화 스테이지 (34) 의 기능들을 수행할 수도 있다. 프로그래밍가능 프로세싱 유닛들 (42) 은 래스터화 스테이지 (34) 의 기능들을 수행하는 고정 기능 프로세싱 유닛들 (44) 에 의해 래스터화된 픽셀들의 셋트를 프로세싱하도록 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프래그먼트 셰이더를 실행할 수도 있다.
심도 테스트 유닛 (48) 은 그 프래그먼트의 샘플 위치에서 심도 버퍼에 저장된 심도 값에 대한 프래그먼트의 심도 값을 테스트하도록 구성되는 소프트웨어를 실행하는 하드웨어 및/또는 프로세싱 유닛들을 포함할 수도 있다. 심도 버퍼는, 일부 예들에서, 프레임 버퍼 (16) 에 포함될 수도 있다. 이러한 테스트는, 프래그먼트가 다른 프래그먼트 뒤에서 폐색되고 따라서 최종적으로 렌더링되는 장면에서 보이지 않을 것인지 여부를 결정하기 위해 유용할 수도 있다. 심도 테스트 유닛 (48) 이, 심도 테스트를 수행하는 것에 기초하여, 프래그먼트가 다른 프래그먼트의 뒤에서 최종적으로 렌더링되는 장면에서 뷰로부터 폐색될 것이라고 결정하는 경우에는, GPU (12) 는 그 프래그먼트를 폐기할 수도 있고, 그 프래그먼트의 추가적인 프로세싱을 중단할 수도 있다.
본 개시의 일 양태에 따르면, 심도 로직 유닛 (54) 은, 그래픽 프로세싱 파이프라인 (24) 의 래스터화 스테이지 (34) 를 수행하는 GPU (12) 에 의해 생성된 하나 이상의 프래그먼트들에 대해 GPU (12) 가 컨서버티브 심도 테스팅 또는 레이트 심도 테스팅을 수행하는지 여부를 결정하도록 구성되는 소프트웨어를 실행하는 하드웨어 및/또는 프로세싱 유닛들을 포함할 수도 있다. GPU (12) 는, GPU (12) 가 하나 이상의 프래그먼트들의 셋트를 프로세싱하기 위해 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행 (즉, 조기 심도 테스팅을 수행) 하도록 프래그먼트 셰이더를 실행하기 전에, 그리고 또한, GPU (12) 가 하나 이상의 프래그먼트들의 셋트를 프로세싱하기 위해 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행 (즉, 레이트 심도 테스팅을 수행) 하도록 프래그먼트 셰이더를 실행한 후에, 심도 테스트 유닛 (48) 으로 하여금 하나 이상의 프래그먼트들의 셋트에 대한 심도 테스트를 수행하게 하는 것에 의해, 래스터화 스테이지 (34) 를 수행하는 것으로부터 생성된 하나 이상의 프래그먼트들의 셋트에 대해 컨서버티브 심도 테스팅을 수행할 수도 있다. 달리 말하면, 컨서버티브 심도 테스팅에서, GPU (12) 는 조기 심도 테스트 및 레이트 심도 테스트를 수행하고, 여기서, 조기 및 레이트는 프래그먼트 셰이더가 프래그먼트들의 프래그먼트 셰이딩을 수행하는 때에 관련된다. 컨서버티브 심도 프로세싱에 반해, GPU (12) 는, 오직 GPU (12) 가 하나 이상의 프래그먼트들의 셋트를 프로세싱하기 위해 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행 (즉, 레이트 심도 테스팅을 수행) 하도록 프래그먼트 셰이더를 실행한 후에만, 심도 테스트 유닛 (48) 으로 하여금 하나 이상의 프래그먼트들의 셋트에 대한 심도 테스트를 수행하게 하는 것에 의해, 래스터화 스테이지 (34) 를 수행하는 것으로부터 생성된 하나 이상의 프래그먼트들의 셋트에 대해 레이트 심도 테스팅을 수행할 수도 있다.
또한, 심도 로직 유닛 (54) 이 심도 테스트 유닛 (48) 으로 하여금 컨서버티브 심도 프로세싱의 일부로서 프래그먼트들의 셋트의 조기 심도 테스팅을 수행하게 지시하는 경우에, 그리고, 심도 테스트 유닛 (48) 이, 그들 하나 이상의 프래그먼트들이 최종적으로 렌더링되는 장면에서 뷰로부터 폐색될 것이라고 결정하기 때문에 심도 로직 유닛 (54) 이 프래그먼트들의 셋트 중의 하나 이상을 폐기하는 경우에, 심도 테스트 유닛 (48) 이 조기 심도 테스팅을 수행한 후에 프로세싱을 위해 프래그먼트 셰이더로 포워딩되는 결과적인 프래그먼트들의 셋트는 심도 테스트 유닛 (48) 에 의해 폐기된 그들 하나 이상의 프래그먼트들을 포함하지 않을 것이다. 유사하게, 심도 로직 유닛 (54) 이 심도 테스트 유닛 (48) 으로 하여금 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱의 일부로서 프래그먼트들의 셋트의 레이트 심도 테스팅을 수행하게 지시하는 경우에, 그리고, 심도 테스트 유닛 (48) 이, 그들 하나 이상의 프래그먼트들이 최종적으로 렌더링되는 장면에서 뷰로부터 폐색될 것이라고 결정하기 때문에 심도 테스트 유닛 (48) 이 프래그먼트들의 셋트 중의 하나 이상을 폐기하는 경우에, 심도 테스트 유닛 (48) 이 조기 심도 테스팅을 수행한 후에 GPU (12) 가 프레임 버퍼 (16) 내로 기입하는 결과적인 프래그먼트들의 셋트는 심도 테스트 유닛 (48) 에 의해 폐기된 그들 하나 이상의 프래그먼트들을 포함하지 않을 것이다.
심도 로직 유닛 (54) 은, GPU (12) 가 트랜잭션 단위로 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행하는지 여부의 이러한 결정을 실시하는 것이 가능할 수도 있다. 트랜잭션은 래스터화 스테이지 (34) 의 기능을 수행하는 GPU (12) 에 의해 주어진 클럭 사이클에서 생성된 하나 이상의 프래그먼트들의 셋트일 수도 있다. 다른 예들에서, 트랜잭션은 소프트웨어 애플리케이션 (18) 에 의한 드로우 호출의 결과로서 생성된 프래그먼트들의 총 수보다 적은 하나 이상의 프래그먼트들의 셋트일 수도 있다. 이와 같이, 심도 로직 유닛 (54) 은, GPU (12) 가 단일의 드로우 호출을 프로세싱함에 있어서 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행하는지 여부에 관해 다수의 결정들을 실시할 수 있다. 일부 예들에서, 래스터화 스테이지 (34) 의 기능들을 수행하는 GPU (12) 의 래스터라이저는 트랜잭션 당 4x4 픽셀 타일과 같은 하나 이상의 프래그먼트들을 생성할 수도 있다. 따라서, 주어진 클럭 사이클에서 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들의 각 셋트에 대해, 심도 로직 유닛 (54) 은, GPU (12) 가 그 하나 이상의 프래그먼트들의 셋트에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행하는지 여부를 결정할 수도 있다. 트랜잭션 단위로 결정을 실시함으로써, 심도 로직 유닛 (54) 은 GPU (12) 가 하나 이상의 프래그먼트들의 셋트를 생성하는 래스터라이저의 각각의 별개의 트랜잭션 (예컨대, 래스터화 스테이지 (34) 에 의해 생성된 각각의 별개의 4x4 픽셀 타일) 에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행하는지 여부의 별개의 결정들을 실시할 수도 있다.
심도 로직 유닛 (54) 은, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하에 적어도 부분적으로 기초하여 하나 이상의 프래그먼트들의 셋트에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다. 심도 로직 유닛 (54) 이 프래그먼트 셰이더 프로그램이 가볍게 로딩되는 (lightly loaded) 것으로 결정하는 경우에, 심도 로직 유닛 (54) 은 GPU (12) 로 하여금 하나 이상의 프래그먼트들의 레이트 심도 테스팅만을 수행함으로써 하나 이상의 프래그먼트들의 셋트에 대해 레이트 심도 프로세싱을 수행하게 할 수도 있다. 다른 한편, 심도 로직 유닛 (54) 이, 프래그먼트 셰이더가 무겁게 로딩된다고 (heavily loaded) 결정하는 경우에, 심도 로직 유닛 (54) 은 GPU (12) 로 하여금 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱을 수행하게 할 수도 있고, 또는, GPU (12) 로 하여금, 클럭 사이클 동안 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부의 결정을 클럭 사이클에 대해 스톨 (stall) 되게 할 수도 있다.
심도 로직 유닛 (54) 은, 프래그먼트 셰이더 프로그램에 의한 프로세싱을 위해 프래그먼트들을 큐잉하는 셰이더 입력 버퍼 (50) 의 상태에 적어도 부분적으로 기초하여 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정할 수도 있다. 심도 로직 유닛 (54) 은, 셰이더 입력 버퍼 (50) 의 용량에 비교되는 셰이더 입력 버퍼 (50) 에 저장되는 데이터의 양에 적어도 부분적으로 기초하여 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정할 수도 있다. 하나의 예에서, 심도 로직 유닛 (54) 은, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 많지 않은 경우에, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다. 심도 로직 유닛 (54) 은, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 많은 경우에, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더 프로그램이 무겁게 로딩된다고 결정할 수도 있다.
다른 예들에서, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양과, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를 구성하는 셰이더 입력 버퍼 (50) 의 용량 사이의 비율은 상이할 수도 있다. 예를 들어, 하나의 예에서, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 3/5 보다 더 많지 않은 경우에 프래그먼트 셰이더 프로그램이 가볍게 로딩될 수도 있다는 점에서, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치는 3/5 일 수도 있다. 다른 예에서, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양과, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를 구성하는 셰이더 입력 버퍼 (50) 의 용량 사이의 비율은 상이할 수도 있고, 임의의 다른 적합한 임계치일 수도 있다.
심도 로직 유닛 (54) 은 또한, 히스테리시스 (hysteresis) 에 기초하여 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를 동적으로 결정할 수도 있다. 달리 말하면, 임계치는 셰이더 입력 버퍼 (50) 의 현재 및 과거 입력들에 의존할 수도 있다. 하나의 예에서, 심도 로직 유닛 (54) 이, 셰이더 입력 버퍼 (50) 가 30% 미만으로 찬 것을 결정하는 경우에, 심도 로직 유닛은 프래그먼트 셰이더 프로그램이 가볍게 로딩되는 것으로 결정할 수도 있다. 일단 셰이더 입력 버퍼 (50) 가 30% 미만으로 차면, 셰이더 입력 버퍼 (50) 가 다수의 클럭 사이클들에 걸쳐서 30% 미만으로 찬 상태에서 30% 보다 더 많이 찬 상태로 성장하는 경우에, 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 70% 보다 더 많은 것으로 성장할 때까지 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 계속 결정할 수도 있고, 셰이더 입력 버퍼 (50) 의 용량의 70% 보다 더 많이 차는 시점에서, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 프로그램이 무겁게 로딩된다고 결정할 수도 있다. 일단 셰이더 입력 버퍼 (50) 가 70% 보다 더 많이 차면, 심도 로직 유닛 (54) 은 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 30% 미만으로 감소될 때까지 프래그먼트 셰이더 프로그램이 무겁게 로딩된다고 계속 결정할 수도 있고, 셰이더 입력 버퍼 (50) 의 용량의 30% 미만으로 감소되는 시점에서, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다. 이러한 방식으로, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를 동적으로 설정 및 변경할 수도 있다.
일부 예들에서, 셰이더 입력 버퍼 (50) 는 프로그래밍가능 프로세싱 유닛들 (42) 의 각각의 병렬적 셰이더 프로세서들 상에서 실행되는 프래그먼트 셰이더 프로그램에 의한 프로세싱을 위해 데이터를 버퍼링하는 복수의 버퍼들을 포함할 수도 있다. 심도 로직 유닛 (54) 은, 버퍼에 저장된 데이터의 양 대 복수의 버퍼들 중 적어도 하나의 버퍼의 용량 사이의 비율이 임계치 미만인 경우에 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다. 예를 들어, 버퍼들 중 적어도 하나가 절반보다 더 많이 찬 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다.
다른 예들에서, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치는 셰이더 입력 버퍼 (50) 의 용량을 고려함이 없이 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양에 기초할 수도 있다. 예를 들어, 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양이 하나 이상의 프래그먼트들을 포함하는 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더 프로그램이 무겁게 로딩된다고 결정할 수도 있다. 역으로, 셰이더 입력 버퍼가 빈 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다.
심도 로직 유닛 (54) 은 또한, GPU (12) 의 다양한 컴포넌트들의 이용을 결정하는 것에 적어도 부분적으로 기초하여 프래그먼트 셰이더 프로그램의 작업부하를 결정할 수도 있다. 심도 로직 유닛 (54) 은, 텍스처 프로세서들, 셰이더 프로세서들, 산술 로직 유닛 (ALU) 들 등과 같은 프로세서 클러스터 (46) 의 컴포넌트들의 부하 및/또는 이용, 및 프로세서 클러스터 (46) 의 컴포넌트들과 캐시들 및/또는 메모리들 사이의 메모리 대역폭의 트래픽을 모니터링할 수도 있다. 심도 로직 유닛 (54) 은, 프로세서 클러스터 (46) 의 부하 및/또는 이용 및 클럭 사이클 단위의 메모리 트래픽에 기초하여 또는 수개의 클럭 사이클들에 걸친 평균 부하 및/또는 이용에 기초하여 프래그먼트 셰이더 프로그램의 작업부하를 결정할 수도 있다. 이러한 방식으로, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를, 프로세서 클러스터 (46) 의 특정 부하 및/또는 이용 또는 수개의 클럭 사이클들에 걸친 평균 온도 또는 순시적으로 측정된 메모리 트래픽의 특정 레벨로서 결정할 수도 있다. 심도 로직 유닛 (54) 은 또한, 프로세서 클러스터 (46) 의 프로세서 부하를 결정하기 위해 프로세서 클러스터 (46) 의 하드웨어 컴포넌트들의 온도를 측정할 수도 있고, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치를 수개의 클럭 사이클들에 걸친 평균 온도 또는 순시적으로 측정된 특정 온도로서 결정할 수도 있다.
도 4 는 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다. 도 4 에서 도시된 바와 같이, GPU (12) 는, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하도록 GPU (12) 를 실행하는 프래그먼트 셰이더에 의한 프로세싱을 위한 하나 이상의 프래그먼트들을 생성하기 위해 래스터화 스테이지 (34) 의 기능들을 수행할 수도 있다 (62). GPU (12) 에 응답하여, 래스터화 스테이지 (34) 의 기능들을 수행하고 하나 이상의 프래그먼트들을 출력하는 것의 결과로서, 심도 로직 유닛 (54) 은 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다 (64).
심도 로직 유닛 (54) 은 프래그먼트 셰이더의 작업부하에 적어도 부분적으로 기초하여 이러한 결정을 실시할 수도 있다. 구체적으로, 심도 로직 유닛 (54) 은 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 높은지 여부를 결정할 수도 있다. 심도 로직 유닛 (54) 이 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 높다고 결정하는 경우에, 심도 로직 유닛 (54) 은 GPU (12) 로 하여금 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱을 수행하게 할 수도 있다. 컨서버티브 심도 프로세싱을 수행하는 것의 일부로서, 심도 테스트 유닛 (48) 은 조기 심도 테스팅 및 레이트 심도 테스팅 양자를 수행할 수도 있다 (66). 심도 테스트 유닛 (48) 은, 심도 테스트 유닛 (48) 이 최종적으로 렌더링되는 장면에서의 뷰로부터 폐색될 것으로 결정하는 임의의 프래그먼트들을 폐기할 수도 있고, 나머지 하나 이상의 프래그먼트들을 프래그먼트 셰이더에 의한 프로세싱을 위해 출력할 수도 있다. 심도 테스트 유닛 (48) 에 의해 수행되는 조기 심도 테스팅이 프래그먼트 셰이더에 의해 프로세싱되지 않을 하나 이상의 프래그먼트들을 폐기할 수도 있기 때문에, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 스테이지 (36) 에서의 부하를 감소시킬 수도 있고, 이에 의해, 프래그먼트 셰이더에 의한 프로세싱을 위해 보다 적은 프래그먼트들을 잠재적으로 제공함으로써 GPU 의 퍼포먼스를 향상시킬 수도 있다.
반면에, 심도 로직 유닛 (54) 이 프래그먼트 셰이더의 작업부하가 특정 임계치 미만이라고 결정하는 경우에, 심도 로직 유닛 (54) 은 GPU (12) 로 하여금, 심도 테스트 유닛 (48) 이 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행하는 일 없이 프래그먼트 셰이더에 의한 프로세싱을 위한 입력으로서 하나 이상의 프래그먼트들을 제공함으로써 하나 이상의 프래그먼트들에 대해 레이트 심도 프로세싱을 수행하게 할 수도 있다. 이러한 경우에, 프래그먼트 셰이더의 상대적으로 보다 낮은 작업부하 때문에, 프래그먼트 셰이더는 GPU (12) 의 퍼포먼스를 감소시키는 일 없이 프래그먼트들을 프로세싱하는 것이 가능할 수도 있다.
GPU (12) 는, 컨서버티브 심도 프로세싱의 경우에, 심도 테스트 유닛 (48) 으로부터 출력된 나머지 하나 이상의 프래그먼트들을 프로세싱하기 위해서, 또는, 레이트 심도 프로세싱의 경우에, 래스터화 스테이지 (34) 의 기능들을 수행하는 래스터라이저 하드웨어에 의해 생성된 하나 이상의 프래그먼트들을 프로세싱하기 위해서, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프래그먼트 셰이더를 실행할 수도 있다 (68). 심도 테스트 유닛 (48) 은 프래그먼트 셰이더에 의해 출력된 하나 이상의 프래그먼트들의 심도 테스팅을 수행할 수도 있다 (70). 심도 테스트 유닛 (48) 은, 심도 테스트 유닛 (48) 이 최종적으로 렌더링되는 장면에서의 뷰로부터 폐색될 것으로 결정하는 임의의 프래그먼트들을 폐기할 수도 있고, 나머지 하나 이상의 프래그먼트들에 대한 값을 프레임 버퍼 (16) 내로 기입할 수도 있다 (72).
본 개시의 일 양태에 따라, 심도 로직 유닛 (54) 은 추가적으로, 하나 이상의 프래그먼트들의 심도 테스팅을 수행하기 위한 심도 테스트 유닛 (48) 의 이용가능성에 적어도 부분적으로 기초하여 GPU (12) 의 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다. 단일의 심도 테스트 유닛 (48) 은, 컨서버티브 심도 프로세싱의 경우에 조기 심도 테스팅을 수행하고, 컨서버티브 심도 프로세싱 및 레이트 심도 프로세싱의 경우에, 레이트 심도 테스팅을 수행한다. 따라서, 프래그먼트 셰이더 스테이지 (36) 의 기능들을 수행하기 위해 프로그래밍가능 프로세싱 유닛들 (42) 상에서 실행되는 프래그먼트 셰이더에 의해 출력되는 프래그먼트들, 및 래스터화 스테이지 (34) 의 기능들을 수행하는 래스터라이저 하드웨어에 의해 생성된 프래그먼트들은 양자 모두, 심도 테스팅을 수행하기 위해 심도 테스트 유닛 (48) 에 대한 입력으로서 주어진 클럭 사이클에서 이용가능할 수도 있다.
도 5 는 심도 테스트 유닛 (48) 의 작업부하에 추가적으로 적어도 부분적으로 기초하여 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다. 도 5 에서 도시된 바와 같이, GPU (12) 의 래스터라이저 (예컨대, 고정 기능 프로세싱 유닛들 (44) 의 하나 이상의 하드웨어 유닛들) 와 같은, GPU (12) 의 업스트림 유닛은 이용가능한 하나 이상의 프래그먼트들을 생성할 수도 있다 (82).
하나 이상의 프래그먼트들이 업스트림 유닛으로부터 이용가능한 것에 응답하여, 심도 로직 유닛 (54) 은, 심도 테스트 유닛 (48) 의 이용가능성에 적어도 부분적으로 기초하여 이용가능한 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다. 구체적으로, 심도 로직 유닛 (54) 은 심도 테스트 유닛 (48) 의 이용가능성을 결정할 수도 있고, 심도 테스트 유닛 (48) 의 이용가능성에 적어도 부분적으로 기초하여 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 결정할 수도 있다 (84). 상기 논의된 바와 같이, (컨서버티브 심도 프로세싱의 경우에) 프래그먼트 셰이딩 이전에 그리고 (레이트 심도 프로세싱 및 컨서버티브 심도 프로세싱 양자의 경우에) 프래그먼트 셰이딩 후에 프래그먼트들의 심도 테스팅을 수행하기 위해 동일한 심도 테스트 유닛 (48) 이 이용될 수도 있다. 따라서, 일부 경우들에서, 심도 테스트 유닛 (48) 은, 프래그먼트 셰이더에 의해 출력되는 하나 이상의 프래그먼트들에 대해 심도 테스트들을 수행하는데 바쁠 수도 있고, 업스트림 유닛으로부터 이용가능한 하나 이상의 프래그먼트들에 대해 심도 테스트들을 수행하기 위해 잉요가능하지 않을 수도 있다.
심도 로직 유닛 (54) 은, 프래그먼트들이 심도 로직 유닛 (54) 에 의한 프로세싱을 위해 프래그먼트 셰이더로부터 이용가능한지 여부에 적어도 부분적으로 기초하여, 업스트림 유닛으로부터 이용가능한 하나 이상의 프래그먼트들에 대해 심도 테스트를 수행하기에 심도 테스트 유닛 (48) 의 작업부하가 너무 높은지 여부를 결정할 수도 있다 (84). 심도 테스트 유닛 (48) 은 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 걸쳐 프래그먼트 셰이더에 의해 출력되는 프래그먼트들의 프로세싱을 우선순위화할 수도 있다. 이와 같이, 프래그먼트 셰이더에 의해 출력되는 프래그먼트들이 심도 테스트 유닛 (48) 에 의해 프로세싱되도록 이용가능한 경우에, 심도 테스트 유닛 (48) 은 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들의 심도 테스팅을 수행하는 대신에 그들 프래그먼트들의 심도 테스팅을 수행할 수도 있다. 다른 한편, 프래그먼트 셰이더에 의해 출력된 프래그먼트들이 심도 테스트 유닛 (48) 에 의해 프로세싱되도록 이용가능하지 않은 경우에, 심도 테스트 유닛 (48) 은 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위해 이용가능할 수도 있다. 따라서, 프래그먼트 셰이더에 의해 출력된 프래그먼트들이 심도 테스트 유닛 (48) 에 의해 프로세싱되도록 이용가능하지 않은 경우에, 심도 로직 유닛 (54) 은 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 테스팅을 수행할 수도 있다 (86). 달리 말하면, 심도 테스트 유닛 (48) 은 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 대해 자유롭게 심도 테스팅을 수행하기 때문에, 심도 로직 유닛 (54) 은, GPU (12) 가, 심도 테스트 유닛 (48) 으로 하여금 하나 이상의 프래그먼트들이 프래그먼트 셰이더에 의해 프로세싱되기 이전에 그 하나 이상의 프래그먼트들의 심도 태스팅 (즉, 조기 심도 테스팅) 을 수행하도록 지시함으로써, 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱을 수행하는 것을 결정할 수도 있다.
프래그먼트 셰이더에 의해 출력된 프래그먼트들이 심도 테스트 유닛 (48) 에 대한 입력으로서 이용가능한 경우에, 심도 테스트 유닛 (48) 은 업스트림 유닛으로부터 이용가능한 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하는 대신에 프래그먼트 셰이더로부터 출력된 그들 프래그먼트들에 대해 심도 테스팅을 수행할 수도 있다. 따라서, 심도 로직 유닛 (54) 은 현재 클럭 사이클 동안 하나 이상의 프래그먼트들에 대해 컨서버티브 심도 프로세싱을 수행하지 않도록 결정할 수도 있다. 대신에, 프래그먼트 셰이더에 의해 출력된 프래그먼트들이 심도 테스트 유닛 (48) 이 그들 프래그먼트들에 대해 심도 프로세싱을 수행하기 위해 이용가능하다고 결정하는 것에 응답하여, 심도 로직 유닛 (54) 은, 하나 이상의 프래그먼트들을 프로세싱하는 것의 퍼포먼스가 그 하나 이상의 프래그먼트들에 대해 레이트 심도 프로세싱을 수행함으로써 향상되는지 여부를 결정하기 위해 프래그먼트 셰이더의 작업부하를 결정할 수도 있다 (88).
구체적으로, 심도 로직 유닛 (54) 은 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 낮은지 여부를 결정할 수도 있다. 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 낮은 경우에, 심도 로직 유닛 (54) 은, 하나 이상의 프래그먼트들의 프로세싱이, 심도 테스트 유닛 (48) 이 프래그먼트 셰이더에 의한 프로세싱 이전에 하나 이상의 프래그먼트들들에 대해 심도 테스팅을 수행하는 일 없이 프래그먼트 셰이더가 그 하나 이상의 프래그먼트들들을 프로세싱하는 것에 의해 향상된다고 결정할 수도 있다. 따라서, 심도 로직 유닛 (54) 이 프래그먼트 셰이더의 작업부하가 특정 임계치 미만이라고 결정하는 것에 응답하여, GPU (12) 는, 프래그먼트 셰이더가 하나 이상의 프래그먼트들을 프로세싱하기 이전에 심도 테스트 유닛 (48) 이 그 하나 이상의 프래그먼트들의 심도 테스팅을 수행하는 일 없이 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들을 그래픽 셰이더에 의해 프로세싱하는 것을 포함하여, 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들에 대해 레이트 심도 프로세싱을 수행할 수도 있다.
프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 높은 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더가 클럭 사이클 동안 하나 이상의 프래그먼트들을 프로세싱하는 것에 의해 하나 이상의 프래그먼트들의 프로세싱이 부정적으로 영향받는다고 결정할 수도 있다. 이 경우에, GPU (12) 는 클럭 사이클 동안 하나 이상의 프래그먼트들을 스톨시킬 수도 있고 (90), 심도 로직 유닛 (54) 이 하나 이상의 프래그먼트들을 프로세싱하기 위해 이용가능한지 여부를 재결정함으로써 후속 (subsequent) 클럭 사이클에서 컨서버티브 심도 프로세싱 또는 레이트 심도 프로세싱을 수행할지 여부를 재결정할 수도 있다 (84).
후속 사이클에서의 프로세스는 도 6 에서 도시된 것과 동일한 플로우를 따를 수도 있다. 예를 들어, 후속 클럭 사이클에서, 심도 로직 유닛 (54) 이 하나 이상의 프래그먼트들의 심도 테스팅을 수행하기 위해 여전히 이용가능하지 않은 경우에, 심도 로직 유닛 (54) 은 프래그먼트 셰이더의 작업부하를 재결정할 수도 있다 (88). 프래그먼트 셰이더의 작업부하가 특정 임계치보다 더 낮은 경우에, 심도 로직 유닛 (54) 은 GPU (12) 로 하여금, 심도 테스트 유닛 (48) 이 하나 이상의 프래그먼트들의 조기 심도 테스트를 수행하는 일 없이 프래그먼트 셰이더에 의해 그 하나 이상의 프래그먼트들을 프로세싱하는 것을 포함하는, 하나 이상의 프래그먼트들의 레이트 심도 프로세싱을 수행하게 할 수도 있다 (90).
도 6 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한, 도 3 의 GPU (12) 의 하드웨어 유닛들을 좀더 자세히 나타내는 블록도이다. 도 6 에서 도시된 바와 같이, 심도 로직 유닛 (54) 은, 멀티플렉서 (52) 가 심도 테스트 유닛 (48) 에 의한 프로세싱을 위해 프래그먼트 셰이더에 의해 출력되는 프래그먼트 또는 래스터라이저에 의해 출력되는 프래그먼트를 포워딩할지 여부를 선택할 수도 있다. 이러한 방식으로, 심도 로직 유닛 (54) 은, 래스터라이저에 의해 출력되는 프래그먼트에 대해 컨서버티브 심도 테스팅이 수행되는지 여부를 결정한다. 상기 논의된 바와 같이, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더에 의해 출력되는 프래그먼트가 심도 테스트 유닛 (48) 에 의한 프로세싱을 위해 준비되는지 여부를 결정하고, 그렇다면, 심도 테스트 유닛 (48) 에 의해 프로세싱될 그 프래그먼트를 선택할 수도 있다. 프래그먼트 셰이더에 의해 출력되는 프래그먼트가 심도 테스트 유닛 (48) 에 의한 프로세싱을 위해 준비되지 않았다면, 심도 로직 유닛 (54) 은 심도 테스트 유닛 (48) 에 의한 프로세싱을 위해 래스터라이저에 의해 출력되는 프래그먼트를 대신 선택할 수도 있다.
셰이더 입력 버퍼 (50) 는 프로세서 클러스터 (46) 상에서 실행되는 프래그먼트 셰이더에 의해 프로세싱될 프래그먼트들을 저장할 수도 있다. 이러한 방식으로, 셰이더 입력 버퍼 (50) 는 프래그먼트들이 프래그먼트 셰이더에 의해 셰이딩될 프래그먼트들에 대한 큐 (queue) 로서 기능한다. 심도 로직 유닛 (54) 은, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양, 보다 구체적으로는, 셰이더 입력 버퍼 (50) 의 용량에 대해 비교되는 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양에 적어도 부분적으로 기초하여, 프로세서 클러스터 (46) 상에서 실행되는 프래그먼트 셰이더의 작업부하를 결정할 수도 있다. 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이, 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 많지 않게 차지하는 등에 의해, 임계치보다 더 적거나 동일한 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더가 가볍게 로딩되고, 프래그먼트 셰이딩을 수행하기 위해 현재 클럭 사이클에서 래스터라이저에 의해 출력되는 프래그먼트에 대해 맡는 것이 가능할 수도 있다고 결정할 수도 있다. 다른 한편, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이, 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 많이 차지하는 등에 의해, 임계치보다 더 많은 경우에, 심도 로직 유닛 (54) 은, 프래그먼트 셰이더가 무겁게 로딩되고, 프래그먼트 셰이딩을 수행하기 위해 현재 클럭 사이클에서 래스터라이저에 의해 출력되는 프래그먼트에 대해 맡는 것이 가능하지 않을 수도 있다고 결정할 수도 있다. 하나의 예에서, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치는, 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 적거나 동일한지 여부에 기초하지만, 다른 예들에서, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치는, 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양과 셰이더 입력 버퍼 (50) 의 용량 사이의 임의의 다른 비율에 기초할 수도 있다. 다른 예들에서, 프래그먼트 셰이더 프로그램이 가볍게 로딩되는지 또는 무겁게 로딩되는지 여부 사이의 임계치는, 셰이더 입력 버퍼 (50) 에 저장된 데이터의 양에 기초할 수도 있다. 예를 들어, 셰이더 입력 버퍼에 저장된 데이터의 양이 10 개 또는 그보다 더 적은 수의 프래그먼트들을 포함하는 경우에, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 프로그램이 가볍게 로딩된다고 결정할 수도 있다. 역으로, 셰이더 입력 버퍼에 저장된 데이터의 양이 10 개보다 더 많은 프래그먼트들을 포함하는 경우에, 심도 로직 유닛 (54) 은 프래그먼트 셰이더 프로그램이 무볍게 로딩된다고 결정할 수도 있다.
래스터라이저에 의해 출력되는 프래그먼트들이 심도 테스트 유닛 (48) 에 의해 프로세싱되는 경우에, GPU (12) 는 심도 테스트 유닛 (48) 에 의한 프로세싱으로부터 초래되는 프래그먼트들을 셰이더 입력 버퍼 (50) 에 저장할 수도 있다. 이러한 심도 테스트 유닛 (48) 에 의한 프로세싱으로부터 초래되는 프래그먼트들은, 심도 테스트 유닛 (48) 이 최종적으로 렌더링되는 장면에서의 뷰로부터 폐색되는 것으로서 프래그먼트들 중 하나 이상을 폐기할 수도 있다. 래스터라이저에 의해 출력되는 프래그먼트들이 심도 테스트 유닛 (48) 에 의해 프로세싱되지 않는 경우에, GPU (12) 는, 심도 로직 유닛 (54) 이 프래그먼트 셰이더가 가볍게 로딩되거나 무겁게 로딩된다고 결정했는지 여부에 의존하여, 셰이더 입력 버퍼 (50) 에서 래스터라이저에 의해 출력되는 것으로서 프래그먼트들을 저장할 수도 있다. GPU (12) 는 프로세서 클러스터 (46) 상에서 실행되는 프래그먼트 셰이더에 의한 프래그먼트 셰이딩을 위해 그들 프래그먼트들을 큐잉하기 위해 셰이더 입력 버퍼 (50) 내로 프랙먼트들을 저장할 수도 있다. 이와 같이, 프래그먼트 셰이더가 하나 이상의 프래그먼트들을 프로세싱하는 것은, GPU (12) 가 상기 하나 이상의 프래그먼트들을 셰이더 입력 버퍼 (50) 내로 저장하는 것을 포함할 수도 있다.
도 7 은 레이트 심도 프로세싱과 컨서버티브 심도 프로세싱 간에 동적으로 스위칭하기 위한 예시적인 프로세스를 나타내는 플로우차트이다. 도 7 에서 도시된 바와 같이, 프로세스는, GPU (12) 에 의해, GPU (12) 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 것을 포함할 수도 있다 (702). 프로세스는 추가적으로, GPU (12) 에 의해, 프래그먼트 셰이더 프로그램의 작업부하를 임계치에 대해 비교하는 것을 포함할 수도 있다 (704). 프로세스는, 프래그먼트 셰이더 프로그램의 작업부하가 임계치보다 더 낮다고 결정하는 것에 응답하여, GPU (12) 에 의해, 프래그먼트 셰이더 프로그램에 의한 프로세싱 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이, 프래그먼트 셰이더 프로그램에 의해 하나 이상의 프래그먼트들을 프로세싱하는 것을 더 포함할 수도 있다 (706). 프로세스는, 프래그먼트 셰이더 프로그램에 의한 프로세싱 후에, 하나 이상의 비-폐색된 프래그먼트들을 초래할 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 GPU (12) 에 의해 수행하는 것을 더 포함할 수도 있다 (708). 프로세스는, GPU (12) 에 의해, 하나 이상의 비-폐색된 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 (16) 내로 쓰는 것을 더 포함할 수도 있다.
일부 예들에서, 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 것은, 프래그먼트 셰이더 프로그램에 의해 출력된 하나 이상의 프래그먼트들이 제 2 의 하나 이상의 프래그먼트들에 대한 심도 테스팅을 수행하기 위해 GPU (12) 에 대한 입력으로서 이용가능한 것을 GPU (12) 에 의해 결정하는 것에 대해 응답하는 것이다. 일부 예들에서, 프로세스는 추가적으로, GPU (12) 에 의해, GPU (12) 의 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들의 각각의 트랜잭션에 대해, GPU (12) 의 래스터라이저에 의해 생성된 각각의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 것을 포함한다.
일부 예들에서, 프로세스는 추가적으로, 프래그먼트 셰이더 프로그램의 작업부하가 임계치보다 더 높다고 결정하는 것에 응답하여, 후속 클럭 사이클에서 프래그먼트 셰이더 프로그램의 후속 작업부하를 재결정하는 것, 및, 프래그먼트 셰이더 프로그램의 후속 작업부하가 임계치보다 더 낮다고 재결정하는 것에 응답하여, GPU (12) 에 의해 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이, 프래그먼트 셰이더 프로그램에 의해 하나 이상의 프래그먼트들을 프로세싱하는 것을 포함한다.
일부 예들에서, 프로세스는 추가적으로, GPU (12) 의 래스터라이저가 프래그먼트 셰이더 프로그램에 의해 프로세싱될 제 2 의 하나 이상의 프래그먼트들을 출력하는 것에 응답하여, 후속 클럭 사이클에서 GPU (12) 에 의해, 프래그먼트 셰이더 프로그램에 의해 출력된 제 3 의 하나 이상의 프래그먼트들이 GPU (12) 가 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능한지 여부에 적어도 부분적으로 기초하여 제 2 의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 것을 포함한다. 일부 예들에서, 프로세스는 추가적으로, 제 3 의 하나 이상의 프래그먼트들이 GPU (12) 가 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능하지 않다고 결정하는 것에 응답하여, GPU (12) 에 의해, 제 2 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하는 것을 포함한다. 일부 예들에서, 프로세스는 추가적으로, 프래그먼트 셰이더 프로그램에 의해, 제 2 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하는 것으로부터 발생되는 제 4 의 하나 이상의 프래그먼트들을 프로세싱하는 것을 포함한다. 일부 예들에서, 프로세스는 추가적으로, GPU (12) 에 의해, 제 4 의 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하는 것을 포함한다.
일부 예들에서, 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 것은, 프래그먼트 셰이더 프로그램에 대한 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양에 적어도 부분적으로 기초한다. 일부 예들에서, 프래그먼트 셰이더 프로그램의 작업부하가 임계치보다 더 낮다고 결정하는 것은, 셰이더 입력 버퍼 (50) 에서 저장된 데이터의 양이 셰이더 입력 버퍼 (50) 의 용량의 절반보다 더 많지 않다고 결정하는 것을 포함한다.
일부 예들에서, 프로세스는 추가적으로, 후속 클럭 사이클에서 GPU (12) 의 래스터라이저가 프래그먼트 셰이더 프로그램에 의해 프로세싱될 제 2 의 하나 이상의 프래그먼트들을 출력하는 것에 응답하여, GPU (12) 에 의해, 후속 클럭 사이클에서 프래그먼트 셰이더 프로그램의 작업부하를 재결정하는 것을 포함한다. 일부 예들에서, 프로세스는 추가적으로, 후속 클럭 사이클에서의 프래그먼트 셰이더 프로그램의 재결정된 작업부하가 특정 임계치보다 더 높은 것에 응답하여, GPU (12) 에 의해, 프래그먼트 셰이더 프로그램에 의해 제 2 의 하나 이상의 프래그먼트들의 프로세싱 이전에 제 2 의 하나 이상의 프래그먼트들의 조기 심도 프로세싱을 수행하는 것을 포함한다.
하나 이상의 예들에서, 설명된 기능들은 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현되는 경우, 이 기능들은 컴퓨터 판독가능 매체 상에 하나 이상의 명령들 또는 코드로서 저장되거나 또는 송신될 수도 있다. 컴퓨터 판독가능 매체들은 한 장소로부터 또 다른 장소로 컴퓨터 프로그램의 전송을 용이하게 하는 임의의 매체를 포함하는 통신 매체들 또는 컴퓨터 데이터 저장 매체들을 포함할 수도 있다. 데이터 저장 매체는 본 개시물에서 설명하는 기법들의 구현을 위한 명령들, 코드 및/또는 데이터 구조들을 취출하기 위해 하나 이상의 컴퓨터들 또는 하나 이상의 프로세서들에 의해 액세스될 수 있는 임의의 가용 매체들일 수도 있다. 비한정적인 예로서, 이런 컴퓨터 판독가능 매체들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광디스크 스토리지, 자기디스크 스토리지 또는 다른 자기 저장 디바이스들, 또는 원하는 프로그램 코드를 명령들 또는 데이터 구조들의 형태로 전달하거나 또는 저장하는데 사용될 수 있고 컴퓨터에 의해 액세스될 수 있는 임의의 다른 매체를 포함할 수 있다. 또한, 임의의 접속이 컴퓨터 판독가능 매체로 적절히 지칭된다. 예를 들어, 소프트웨어가 웹사이트, 서버, 또는 다른 원격 소스로부터 동축 케이블, 광섬유 케이블, 연선, 디지털 가입자 회선 (DSL), 또는 무선 기술들, 예컨대 적외선, 라디오, 및 마이크로파를 이용하여 송신되면, 동축 케이블, 광섬유 케이블, 연선, DSL, 또는 무선 기술들 예컨대 적외선, 라디오, 및 마이크로파가 그 매체의 정의에 포함된다. 디스크 (disk) 및 디스크 (disc) 는, 본원에서 사용될 때, 컴팩트 디스크 (CD), 레이저 디스크, 광 디스크, 디지털 다기능 디스크 (DVD), 플로피 디스크 및 Blu-ray 디스크를 포함하며, 디스크들 (disks) 은 데이터를 자기적으로 보통 재생하지만, 디스크들 (discs) 은 레이저로 데이터를 광학적으로 재생한다. 앞에서 언급한 것들의 결합들이 또한 컴퓨터 판독가능 매체들의 범위 내에 포함되어야 한다.
코드는 하나 이상의 디지털 신호 프로세서들 (DSP들), 범용 마이크로프로세서들, 주문형 집적회로들 (ASIC들), 필드 프로그래밍가능 로직 어레이들 (FPGA들), 또는 다른 등가의 집적 또는 이산 로직 회로와 같은, 하나 이상의 프로세서들에 의해 실행될 수도 있다. 따라서, 용어 "프로세서" 및 "프로세싱 유닛" 은, 본원에서 사용될 때 전술한 구조 중 임의의 구조 또는 본원에서 설명하는 기법들의 구현에 적합한 임의의 다른 구조를 지칭할 수도 있다. 게다가, 일부 양태들에서, 본원에서 설명하는 기능은 인코딩 및 디코딩을 위해 구성되는 전용 하드웨어 및/또는 소프트웨어 모듈들 내에 제공되거나, 또는 결합된 코덱에 포함될 수도 있다. 또한, 이 기법들은 하나 이상의 회로들 또는 로직 엘리먼트들로 전적으로 구현될 수 있다.
본 개시물의 기법들은 무선 핸드셋, 집적 회로 (IC) 또는 IC들의 셋트 (즉, 칩 셋트) 를 포함한, 매우 다양한 디바이스들 또는 장치들로 구현될 수도 있다. 개시한 기법들을 수행하도록 구성되는 디바이스들의 기능적 양태들을 강조하기 위해서 여러 구성요소들, 모듈들 또는 유닛들이 본 개시물에서 설명되지만, 상이한 하드웨어 유닛들에 의한 실현을 반드시 필요로 하지는 않는다. 대신, 위에서 설명한 바와 같이, 여러 유닛들이 코덱 하드웨어 유닛에 결합되거나 또는 적합한 소프트웨어 및/또는 펌웨어와 함께, 위에서 설명한 바와 같은 하나 이상의 프로세서들을 포함한, 상호작용하는 하드웨어 유닛들의 컬렉션으로 제공될 수도 있다. 여러 예들이 설명되었다. 이들 및 다른 예들은 다음 청구항들의 범위 이내이다.
Claims (30)
- 그래픽 프로세싱 방법으로서,
그래픽 프로세싱 유닛 (GPU) 에 의해, 상기 GPU 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 단계;
상기 GPU 에 의해, 상기 프래그먼트 셰이더 프로그램의 상기 작업부하를 임계치에 대해 비교하는 단계 (64);
상기 프래그먼트 셰이더의 상기 작업부하가 상기 임계치보다 더 낮다고 결정하는 것에 응답하여, 상기 프래그먼트 셰이더 프로그램에 의해 하나 이상의 프래그먼트들을 프로세싱하는 단계로서, 상기 프래그먼트 셰이더 프로그램에 의한 프로세싱 (68) 전에 상기 하나 이상의 프래그먼트들의 조기 심도 테스팅 (early depth testing) (66) 을 수행함이 없이 상기 하나 이상의 프래그먼트들을 프로세싱하는 단계;
상기 프래그먼트 셰이더 프로그램에 의한 프로세싱 (68) 후에 상기 GPU 에 의해, 하나 이상의 비-폐색 프래그먼트들 (non-occluded fragments) 을 발생시키기 위해 상기 하나 이상의 프래그먼트들의 레이트 심도 테스팅 (late depth testing) (70) 을 수행하는 단계; 및
상기 GPU 에 의해, 상기 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입하는 단계 (72) 를 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
상기 GPU 에 의해, 상기 프래그먼트 셰이더 프로그램에 의해 출력되는 제 2 의 하나 이상의 프래그먼트들이 상기 GPU 가 상기 제 2 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위해 이용가능하다고 결정하는 것에 응답하여, 상기 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
상기 GPU 에 의해, 상기 GPU 의 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들의 각각의 트랜잭션에 대해, 상기 GPU 의 상기 래스터라이저에 의해 생성된 각각의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
상기 프래그먼트 셰이더 프로그램의 상기 작업부하가 상기 임계치보다 더 높다고 결정하는 것에 응답하여, 후속 클럭 사이클에서 상기 프래그먼트 셰이더 프로그램의 후속 작업부하를 재결정하는 단계; 및
상기 프래그먼트 셰이더 프로그램의 상기 후속 작업부하가 상기 임계치보다 더 낮다고 재결정하는 것에 응답하여, 상기 GPU 에 의해 상기 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이, 상기 프래그먼트 셰이더 프로그램에 의해 상기 하나 이상의 프래그먼트들을 프로세싱하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
상기 GPU 의 래스터라이저에 의해, 상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 제 2 의 하나 이상의 프래그먼트들을 출력하는 단계;
상기 GPU 의 상기 래스터라이저가 상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 상기 제 2 의 하나 이상의 프래그먼트들을 출력하는 것에 응답하여, 후속 클럭 사이클에서 상기 GPU 에 의해, 상기 프래그먼트 셰이더 프로그램에 의해 출력된 제 3 의 하나 이상의 프래그먼트들이 상기 GPU 가 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능한지 여부에 적어도 부분적으로 기초하여 제 2 의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 단계;
상기 GPU 에 의해, 상기 제 3 의 하나 이상의 프래그먼트들이 상기 GPU 가 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능하지 않은 것을 결정하는 단계;
상기 제 3 의 하나 이상의 프래그먼트들이 상기 GPU 가 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능하지 않다고 결정하는 것에 응답하여, 상기 GPU 에 의해, 상기 제 2 의 하나 이상의 프래그먼트들에 대해 조기 심도 테스팅을 수행하는 단계;
상기 프래그먼트 셰이더 프로그램에 의해, 상기 제 2 의 하나 이상의 프래그먼트들에 대해 조기 심도 테스팅을 수행하는 것으로부터 발생되는 제 4 의 하나 이상의 프래그먼트들을 프로세싱하는 단계; 및
상기 GPU 에 의해, 상기 제 4 의 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
상기 프래그먼트 셰이더 프로그램에 대한 입력 버퍼에서 저장된 데이터의 양에 적어도 부분적으로 기초하여 상기 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 제 6 항에 있어서,
상기 프래그먼트 셰이더 프로그램의 상기 작업부하가 상기 임계치보다 더 낮다고 결정하는 것은, 상기 입력 버퍼에서 저장된 상기 데이터의 양이 상기 입력 버퍼의 용량의 절반보다 더 많지 않다고 결정하는 것을 포함하는, 그래픽 프로세싱 방법. - 제 1 항에 있어서,
후속 클럭 사이클에서 상기 GPU 의 래스터라이저에 의해, 상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 제 2 의 하나 이상의 프래그먼트들을 출력하는 단계;
상기 GPU 의 상기 래스터라이저가 상기 후속 클럭 사이클에서 상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 상기 제 2 의 하나 이상의 프래그먼트들을 출력하는 것에 응답하여, 상기 GPU 에 의해, 상기 후속 클럭 사이클에서 상기 프래그먼트 셰이더 프로그램의 작업부하를 재결정하는 단계;
상기 후속 클럭 사이클에서의 상기 프래그먼트 셰이더 프로그램의 재결정된 상기 작업부하가 상기 임계치보다 더 높은 것에 응답하여, 상기 GPU 에 의해, 상기 프래그먼트 셰이더 프로그램에 의해 상기 제 2 의 하나 이상의 프래그먼트들의 프로세싱 이전에 상기 제 2 의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행하는 단계를 더 포함하는, 그래픽 프로세싱 방법. - 그래픽 프로세싱 유닛 (GPU) 상에서 실행되는 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 수단;
상기 프래그먼트 셰이더 프로그램의 상기 작업부하를 임계치에 대해 비교 (64) 하는 수단;
상기 프래그먼트 셰이더 프로그램의 상기 작업부하가 상기 임계치보다 더 낮다고 결정하는 것에 응답하여, 상기 프래그먼트 셰이더 프로그램에 의한 프로세싱 (68) 전에 하나 이상의 프래그먼트들의 조기 심도 테스팅 (early depth testing) (66) 을 수행함이 없이 상기 하나 이상의 프래그먼트들을 프로세싱하는 수단;
상기 프래그먼트 셰이더 프로그램에 의한 프로세싱 (68) 후에, 하나 이상의 비-폐색 프래그먼트들 (non-occluded fragments) 을 발생시키기 위해 상기 하나 이상의 프래그먼트들의 레이트 심도 테스팅 (late depth testing) (70) 을 수행하는 수단; 및
상기 하나 이상의 비-폐색 프래그먼트들에 대한 픽셀 값들을 프레임 버퍼 내에 기입 (72) 하는 수단을 포함하는, 장치. - 제 9 항에 있어서,
상기 프래그먼트 셰이더 프로그램에 의해 출력되는 제 2 의 하나 이상의 프래그먼트들이 상기 제 2 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위해 이용가능하다고 결정하는 것, 및 상기 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 것에 응답하여, 상기 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 수단을 더 포함하는, 장치. - 제 9 항에 있어서,
상기 GPU 의 래스터라이저에 의해 생성된 하나 이상의 프래그먼트들의 각각의 트랜잭션에 대해, 상기 GPU 의 상기 래스터라이저에 의해 생성된 각각의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 수단을 더 포함하는, 장치. - 제 9 항에 있어서,
상기 프래그먼트 셰이더 프로그램의 상기 작업부하가 상기 임계치보다 더 높다고 결정하는 것에 응답하여, 후속 클럭 사이클에서 상기 프래그먼트 셰이더 프로그램의 후속 작업부하를 재결정하는 수단; 및
상기 프래그먼트 셰이더 프로그램의 상기 후속 작업부하가 상기 임계치보다 더 낮다고 재결정하는 것에 응답하여, 상기 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행함이 없이, 상기 프래그먼트 셰이더 프로그램에 의해 상기 하나 이상의 프래그먼트들을 프로세싱하는 수단을 더 포함하는, 장치. - 제 9 항에 있어서,
상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 제 2 의 하나 이상의 프래그먼트들을 출력하는 수단;
상기 프래그먼트 셰이더 프로그램에 의해 프로세싱될 상기 제 2 의 하나 이상의 프래그먼트들을 출력하는 것에 응답하여, 후속 클럭 사이클에서, 상기 프래그먼트 셰이더 프로그램에 의해 출력된 제 3 의 하나 이상의 프래그먼트들이 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위해 이용가능한지 여부에 적어도 부분적으로 기초하여 제 2 의 하나 이상의 프래그먼트들의 조기 심도 테스팅을 수행할지 여부를 결정하는 수단;
상기 제 3 의 하나 이상의 프래그먼트들이 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위한 입력으로서 이용가능하지 않은 것을 결정하는 수단;
상기 제 3 의 하나 이상의 프래그먼트들이 상기 제 3 의 하나 이상의 프래그먼트들에 대해 심도 테스팅을 수행하기 위해 이용가능하지 않다고 결정하는 것에 응답하여, 상기 제 2 의 하나 이상의 프래그먼트들에 대해 조기 심도 테스팅을 수행하는 수단;
상기 제 2 의 하나 이상의 프래그먼트들에 대해 조기 심도 테스팅을 수행하는 것으로부터 발생되는 제 4 의 하나 이상의 프래그먼트들을 프로세싱하는 수단; 및
상기 제 4 의 하나 이상의 프래그먼트들의 레이트 심도 테스팅을 수행하는 수단을 더 포함하는, 장치. - 제 9 항에 있어서,
상기 프래그먼트 셰이더 프로그램에 대한 입력 버퍼에서 저장된 데이터의 양에 적어도 부분적으로 기초하여 상기 프래그먼트 셰이더 프로그램의 작업부하를 결정하는 수단을 더 포함하고,
상기 프래그먼트 셰이더의 상기 작업부하가 특정 임계치보다 더 낮다고 결정하는 수단은 바람직하게는, 상기 입력 버퍼에서 저장된 상기 데이터의 양이 상기 입력 버퍼의 용량의 절반보다 더 많지 않다고 결정하는 수단을 포함하는, 장치. - 명령들을 저장한 컴퓨터-판독가능 저장 매체로서,
상기 명령들은, 실행될 때, 하나 이상의 프로그래밍가능 프로세서들로 하여금, 제 1 항 내지 제 8 항 중 어느 한 항에 따른 방법을 수행하게 하는, 컴퓨터-판독가능 저장 매체. - 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
- 삭제
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/862,532 US9824458B2 (en) | 2015-09-23 | 2015-09-23 | Dynamically switching between late depth testing and conservative depth testing |
US14/862,532 | 2015-09-23 | ||
PCT/US2016/044060 WO2017052750A2 (en) | 2015-09-23 | 2016-07-26 | Dynamically switching between late depth testing and conservative depth testing |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20180054814A KR20180054814A (ko) | 2018-05-24 |
KR102006584B1 true KR102006584B1 (ko) | 2019-08-01 |
Family
ID=56567718
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020187011331A KR102006584B1 (ko) | 2015-09-23 | 2016-07-26 | 레이트 심도 테스팅과 컨서버티브 심도 테스팅 간의 동적 스위칭 |
Country Status (7)
Country | Link |
---|---|
US (1) | US9824458B2 (ko) |
EP (1) | EP3353746B1 (ko) |
JP (1) | JP6595101B2 (ko) |
KR (1) | KR102006584B1 (ko) |
CN (1) | CN108027956B (ko) |
BR (1) | BR112018005770A2 (ko) |
WO (1) | WO2017052750A2 (ko) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9986225B2 (en) * | 2014-02-14 | 2018-05-29 | Autodesk, Inc. | Techniques for cut-away stereo content in a stereoscopic display |
US10580200B2 (en) | 2017-04-07 | 2020-03-03 | Intel Corporation | Virtual reality apparatus and method including prioritized pixel shader operations, alternate eye rendering, and/or augmented timewarp |
US11270471B2 (en) | 2018-10-10 | 2022-03-08 | Bentley Systems, Incorporated | Efficient refinement of tiles of a HLOD tree |
EP3864627A1 (en) * | 2018-10-14 | 2021-08-18 | Bentley Systems, Incorporated | Conversion of infrastructure model geometry to a tile format |
CN111367780B (zh) * | 2020-03-30 | 2024-02-09 | 芯瞳半导体技术(山东)有限公司 | 一种gpu的性能测试方法、装置及计算机存储介质 |
CN111640162B (zh) * | 2020-05-24 | 2024-01-23 | 中信银行股份有限公司 | 一种基于交通路网的测试结果展示方法、装置、设备和计算机可读存储介质 |
GB2590748B (en) * | 2020-06-30 | 2022-02-02 | Imagination Tech Ltd | Method and graphics processing system for rendering one or more fragments having shader-dependent properties |
US20220414011A1 (en) * | 2021-06-23 | 2022-12-29 | Intel Corporation | Opportunistic late depth testing to prevent stalling for overlapping cache lines |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140354654A1 (en) | 2013-06-04 | 2014-12-04 | Arm Limited | Hidden surface removal in graphics processing systems |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI284857B (en) * | 2005-03-04 | 2007-08-01 | Alpha Imaging Technology Corp | Shading engine |
US8860721B2 (en) | 2006-03-28 | 2014-10-14 | Ati Technologies Ulc | Method and apparatus for processing pixel depth information |
US8933933B2 (en) * | 2006-05-08 | 2015-01-13 | Nvidia Corporation | Optimizing a graphics rendering pipeline using early Z-mode |
US9076265B2 (en) | 2006-06-16 | 2015-07-07 | Ati Technologies Ulc | System and method for performing depth testing at top and bottom of graphics pipeline |
GB2449398B (en) * | 2006-09-29 | 2009-02-11 | Imagination Tech Ltd | Improvements in memory management for systems for generating 3-dimensional computer images |
US8203564B2 (en) * | 2007-02-16 | 2012-06-19 | Qualcomm Incorporated | Efficient 2-D and 3-D graphics processing |
US8325184B2 (en) | 2007-09-14 | 2012-12-04 | Qualcomm Incorporated | Fragment shader bypass in a graphics processing unit, and apparatus and method thereof |
KR101719485B1 (ko) * | 2010-09-20 | 2017-03-27 | 삼성전자주식회사 | 그래픽 처리 유닛에서의 사전 픽셀 제거를 위한 장치 및 방법 |
KR101782044B1 (ko) * | 2011-02-22 | 2017-09-26 | 삼성전자주식회사 | 그래픽 프로세서 및 조기 가시성 테스트 방법 |
CN102509336B (zh) * | 2011-10-24 | 2014-06-18 | 克拉玛依红有软件有限责任公司 | 一种gpu加速的实时立体渲染方法 |
US10559123B2 (en) * | 2012-04-04 | 2020-02-11 | Qualcomm Incorporated | Patched shading in graphics processing |
KR20130123645A (ko) * | 2012-05-03 | 2013-11-13 | 삼성전자주식회사 | 그래픽 처리 장치를 위한 동적 로드 밸런싱 장치 및 방법 |
US9916680B2 (en) * | 2012-10-12 | 2018-03-13 | Nvidia Corporation | Low-power processing in depth read-only operating regimes |
US8941676B2 (en) | 2012-10-26 | 2015-01-27 | Nvidia Corporation | On-chip anti-alias resolve in a cache tiling architecture |
US9953455B2 (en) * | 2013-03-13 | 2018-04-24 | Nvidia Corporation | Handling post-Z coverage data in raster operations |
US9536333B2 (en) | 2013-10-17 | 2017-01-03 | Arm Limited | Method and apparatus for improved processing of graphics primitives |
GB201503125D0 (en) * | 2015-02-25 | 2015-04-08 | Advanced Risc Mach Ltd | Graphics processing systems |
-
2015
- 2015-09-23 US US14/862,532 patent/US9824458B2/en active Active
-
2016
- 2016-07-26 JP JP2018514355A patent/JP6595101B2/ja active Active
- 2016-07-26 CN CN201680054603.7A patent/CN108027956B/zh active Active
- 2016-07-26 WO PCT/US2016/044060 patent/WO2017052750A2/en active Application Filing
- 2016-07-26 EP EP16747700.9A patent/EP3353746B1/en active Active
- 2016-07-26 BR BR112018005770A patent/BR112018005770A2/pt not_active Application Discontinuation
- 2016-07-26 KR KR1020187011331A patent/KR102006584B1/ko active IP Right Grant
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140354654A1 (en) | 2013-06-04 | 2014-12-04 | Arm Limited | Hidden surface removal in graphics processing systems |
Also Published As
Publication number | Publication date |
---|---|
BR112018005770A2 (pt) | 2018-10-09 |
KR20180054814A (ko) | 2018-05-24 |
EP3353746A2 (en) | 2018-08-01 |
EP3353746B1 (en) | 2019-05-01 |
WO2017052750A2 (en) | 2017-03-30 |
US9824458B2 (en) | 2017-11-21 |
JP2018532190A (ja) | 2018-11-01 |
CN108027956A (zh) | 2018-05-11 |
CN108027956B (zh) | 2021-05-25 |
WO2017052750A3 (en) | 2017-05-18 |
US20170084043A1 (en) | 2017-03-23 |
JP6595101B2 (ja) | 2019-10-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102006584B1 (ko) | 레이트 심도 테스팅과 컨서버티브 심도 테스팅 간의 동적 스위칭 | |
KR101813429B1 (ko) | 공유 데이터 채널들을 가지는 셰이더 파이프라인 | |
KR102003655B1 (ko) | 그래픽 프로세싱에서 셰도우 레이들에 대한 트리 횡단을 위한 시작 노드 결정 | |
KR102140387B1 (ko) | 대역폭-압축된 그래픽스 데이터의 저장 | |
US20170352182A1 (en) | Dynamic low-resolution z test sizes | |
EP3427229B1 (en) | Visibility information modification | |
US9852539B2 (en) | Single pass surface splatting | |
JP2018514855A (ja) | ハイブリッド2d/3dグラフィックスレンダリング | |
US9959590B2 (en) | System and method of caching for pixel synchronization-based graphics techniques | |
CN107077716B (zh) | 用于图形处理的动态管线 | |
US10089708B2 (en) | Constant multiplication with texture unit of graphics processing unit |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A201 | Request for examination | ||
A302 | Request for accelerated examination | ||
E701 | Decision to grant or registration of patent right |