KR20160003101A - 타일-기반 렌더러들에 대한 쿼리 프로세싱 - Google Patents
타일-기반 렌더러들에 대한 쿼리 프로세싱 Download PDFInfo
- Publication number
- KR20160003101A KR20160003101A KR1020157033589A KR20157033589A KR20160003101A KR 20160003101 A KR20160003101 A KR 20160003101A KR 1020157033589 A KR1020157033589 A KR 1020157033589A KR 20157033589 A KR20157033589 A KR 20157033589A KR 20160003101 A KR20160003101 A KR 20160003101A
- Authority
- KR
- South Korea
- Prior art keywords
- query
- value
- memory
- memory location
- result
- Prior art date
Links
Images
Classifications
-
- 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
- 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
- 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/10—Geometric effects
- G06T15/40—Hidden part removal
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computer Graphics (AREA)
- Geometry (AREA)
- Image Generation (AREA)
Abstract
그래픽 프로세싱 시스템에서 쿼리들을 수행하는 시스템들, 방법들, 및 장치가 개시된다. 이들 시스템들, 방법들, 및 장치는 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하는 것으로서, 이 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하는, 상기 시작 값을 결정하고, 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정하도록 구성될 수도 있다.
Description
본 출원은 2013년 4월 29일자로 출원된 미국 가출원 제 61/817,154 호에 우선권을 주장하며, 이것의 전체 내용은 참조로서 본원에 포함된다.
본 개시물은 그래픽 프로세싱 시스템들, 및 보다 구체적으로는 타일 기반 렌더러 (renderer) 들에 관한 것이다.
컴퓨팅 디바이스들은 종종, 디스플레이를 위해 그래픽 데이터의 렌더링을 가속화하도록 그래픽 프로세싱 유닛 (GPU) 을 이용한다. 이러한 컴퓨팅 디바이스들은, 예를 들어 컴퓨터 워크스테이션들, 모바일 폰들 (예를 들어, 소위 스마트폰들), 임베딩된 시스템들, 퍼스널 컴퓨터들, 태블릿 컴퓨터들, 및 비디오 게임 콘솔들을 포함할 수도 있다. 렌더링은 일반적으로, 하나 이상의 3D 그래픽 오브젝트들을 포함할 수도 있는 3 차원 (3D) 그래픽 장면을 2 차원 (2D) 래스터화된 이미지 데이터로 변환하는 프로세스를 지칭한다. 그래픽 장면은 하나 이상의 프레임들의 시퀀스로서 렌더링될 수도 있고, 여기서 각각의 프레임은 특정 순간에서 그래픽 장면을 도시한다.
GPU 는 3D 그래픽 장면의 렌더링을 위해 적어도 부분적 하드웨어 가속을 제공하도록 3D 렌더링 파이프라인을 포함할 수도 있다. 장면에서의 3D 그래픽 오브젝트들은 그래픽 애플리케이션에 의해 하나 이상의 3D 그래픽 프리미티브들 (예를 들어, 포인트들, 라인들, 삼각형들, 패치들 등) 로 세분될 수도 있고, GPU 는 렌더링될 프레임들 각각에 대해 장면의 3D 그래픽 프리미티브들을 3D 래스터화된 이미지 데이터로 변환할 수도 있다. 따라서, GPU 렌더링의 특정 콘텍스트에서, 렌더링은 그래픽 장면에서의 3D 오브젝트들에 대응하는 3D 그래픽 프리미티브들을 2D 래스터화된 이미지 데이터로 변환하는 프로세스를 지칭할 수도 있다.
특정 프레임의 3D 그래픽 프리미티브들을 렌더링하기 위해, 호스트 중앙 처리 장치 (CPU) 상에서 실행되는 그래픽 애플리케이션은 렌더링될 프리미티브들에 대응하는 지오메트리 데이터를 GPU-액세스 가능 메모리에 배치하고, 하나 이상의 GPU 상태 셋업 커맨드들을 커맨드 스트림에 배치하며, 하나 이상의 드로우 콜 (드로우 콜) 들을, GPU 로 하여금 지오메트리 데이터에 기초하여 프리미티브들을 렌더링하게 하는 커맨드 스트림에 배치할 수도 있다. GPU 는, 커맨드들이 커맨드 스트림에 배치된 순서로 커맨드 스트림에 포함된 커맨드들을 프로세싱함으로써 장면을 렌더링할 수도 있다.
타일-기반 렌더링으로, GPU 에 의해 타일 단위 당 쿼리 결과가 출력되고 이 결과는 나중에 CPU 에 의해 누산된다. 쿼리 결과들은, 예를 들어 차폐 (occlusion) 쿼리, 타임스탬프 쿼리, 파이프라인 스테이터스 쿼리 (파이프라인 통계) 등으로부터의 결과들을 포함할 수도 있다. 차폐 쿼리는, 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서의 다른 오브젝트들에 의해 가려지거나 가려지지 않는지를 결정하는 그래픽 프로세싱에서의 쿼리이다. 따라서, 이러한 쿼리로부터의 쿼리 결과는, 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서 다른 오브젝트들에 의해 가려지거나 가려지지 않는지 표시를 제공하는 데이터이다.
일부 예들에서, 타임스탬프는, 소정의 이벤트가 발생할 때를 식별하는 인코딩된 정보 또는 캐릭터의 시퀀스이다. 타임스탬프는, 예를 들어 이벤트가 발생한 날짜 및 시간을 제공할 수도 있다. 타임스탬프는 1 초의 작은 부분까지 정확할 수도 있다. 타임스탬프 쿼리는, 예를 들어 이러한 쿼리의 시작에서 종료까지 시간 스탬프들을 비교함으로써 그래픽 장면에서 소정 이벤트들의 타이밍을 체크하는데 사용될 수도 있다. 따라서, 이러한 쿼리로부터의 쿼리 결과는 이러한 쿼리의 시작에서 종료까지 시간 스탬프들의 차이일 수도 있다.
파이프라인 스테이터스 쿼리 또는 파이프라인 통계 쿼리는 그래픽 파이프라인의 스테이터스 정보 및 다양한 통계치를 체크하는데 사용될 수도 있다. 따라서, 이러한 쿼리로부터의 쿼리 결과는 그래픽 파이프라인의 다양한 통계치 및 스테이터스 정보에 관련된 데이터일 수도 있다.
이 중간의 타일당 결과들을 저장하는데 필요한 메모리의 양은 타일들의 수에서의 증가와 선형적으로 증가한다. 또한, 쿼리 결과가 요청되는 경우, CPU 또는 다른 프로세서는 n 개의 메모리 로케이션들에서 이 결과들을 누산하여 최종 값을 찾아낼 필요가 있을 수도 있고, 여기서 "n" 은 장면을 렌더링하는데 사용된 타일들의 수이다. 타일들의 수에서의 증가는 또한, 누산을 행하기 위해 CPU 에 의해 취해진 시간 양을 증가시킨다. 이러한 쿼리들을 수행하기에 더 많은 메모리 및 시간 효율적인 방식이 유리할 수도 있다.
도 1 은 본 개시물의 기법들을 구현하는데 사용될 수도 있는 예시의 컴퓨팅 디바이스를 예시하는 블록도이다.
도 2 는 도 1 에 도시된 컴퓨팅 디바이스의 CPU, GPU 및 메모리를 더 상세히 예시하는 블록도이다.
도 3 은 타일-기반 렌더링을 예시하는 개념도이다.
도 4 는 예시의 차폐 쿼리를 예시하는 개념도이다.
도 5 는 예시의 메모리 맵을 예시하는 개념도이다.
도 6 은 본 개시물에 따른 예시의 메모리 맵을 예시하는 개념도이다.
도 7 은 본 개시물의 기법들에 따라 예시의 차폐 쿼리를 예시하는 개념도이다.
도 8 은 본 개시물의 하나 이상의 양태들을 구현하는 예시의 방법을 나타내는 흐름도이다.
도 2 는 도 1 에 도시된 컴퓨팅 디바이스의 CPU, GPU 및 메모리를 더 상세히 예시하는 블록도이다.
도 3 은 타일-기반 렌더링을 예시하는 개념도이다.
도 4 는 예시의 차폐 쿼리를 예시하는 개념도이다.
도 5 는 예시의 메모리 맵을 예시하는 개념도이다.
도 6 은 본 개시물에 따른 예시의 메모리 맵을 예시하는 개념도이다.
도 7 은 본 개시물의 기법들에 따라 예시의 차폐 쿼리를 예시하는 개념도이다.
도 8 은 본 개시물의 하나 이상의 양태들을 구현하는 예시의 방법을 나타내는 흐름도이다.
본 개시물은 그래픽 프로세싱 시스템들, 및 보다 구체적으로는 타일-기반 렌더러들에 대한 쿼리 프로세싱에 관한 것이다. 타일-기반 렌더링은, 렌더링될 프레임 또는 다른 영역이 타일들 (예를 들어, 직사각형 또는 정사각형 영역들) 로 분할되고, 각각의 타일은 별개로 렌더링되는 프로세싱 기법이다. 타일-기반 렌더링은 장면에서 로컬 공간적 코히런스를 활용하는데 사용되어, 그래픽 파이프라인에서 나중에 제한된 하드웨어 렌더링 리소스들 (예를 들어, 빠른 그래픽 메모리) 의 사용, 또는 양자 모두를 용이하게 한다. 일반적으로, 타일-기반 렌더링에서, 시스템, 장치, 또는 디바이스, 예컨대 컴퓨터 그래픽 디바이스는 프레임을, 예를 들어 규칙적인 그리드로 분할할 수도 있다. 이 그리드는, 프레임 또는 다른 영역의 일부들인 타일들을 형성한다. 각각의 타일은 다른 타일들과 동일한 렌더링 커맨드 스트림을 사용하여 렌더링될 수도 있다.
일부 예들에서, 비닝 또는 타일-기반 렌더링은 "타일들" 또는 "빈들" 로 지칭된 더 작은 부분들에서 3D 장면을 렌더링하기 위한 방식을 제공할 수도 있다. 전술된 바와 같이, 타일 기반 렌더링은 장면에서 로컬 공간적 코히런스를 활용하는데 사용되어, 그래픽 파이프라인에서 나중에 리소스들을 렌더링하는 제한된 하드웨어의 사용 또는 양자 모두를 용이하게 할 수도 있다. 일반적으로, 타일 기반 렌더링에서, 시스템, 장치, 또는 디바이스, 예컨대 컴퓨터 그래픽 디바이스는 프레임을, 예를 들어 규칙적인 그리드로 분할할 수도 있다. 이 그리드는, 프레임 또는 다른 영역의 일부들인 타일들을 형성한다. 일 예에서, 각각의 타일 또는 빈은 동일한 렌더링 커맨드 스트림을 사용하여 렌더링될 수도 있다.
예시의 목적을 위해, 차폐 쿼리들이 논의될 것이지만, 본 개시물의 이들 기법들은 쿼리들의 다른 타입들에도 적용될 수 있음이 이해될 것이다. 전술된 바와 같이, 일부 예들에서 차폐 쿼리는, 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서 다른 오브젝트들에 의해 가려지거나 가려지지 않는지를 결정하는 그래픽 프로세싱에서의 쿼리이다. 예를 들어 GPU 로부터 상이한 타입들의 정보를 쿼리하도록 설계되는 여러 타입들의 쿼리들이 가능하다. 예들은 차폐 쿼리들, 타임스탬프 쿼리들, 파이프라인 스테이터스 쿼리들 (파이프라인 통계들) 등을 포함한다. 일부 예들에서, 타임스탬프는, 소정의 이벤트가 발생할 때를 식별하는 인코딩된 정보 또는 캐릭터의 시퀀스이다. 타임스탬프는, 예를 들어 이벤트가 발생한 날짜 및 시간을 제공할 수도 있다. 타임스탬프는 1 초의 작은 부분까지 정확할 수도 있다. 타임스탬프 쿼리는, 예를 들어 이러한 쿼리의 시작에서 종료까지 시간 스탬프들을 비교함으로써 그래픽 장면에서 소정 이벤트들의 타이밍을 체크하는데 사용될 수도 있다. 파이프라인 스테이터스 쿼리 또는 파이프라인 통계 쿼리는 그래픽 파이프라인의 스테이터스 정보 및 다양한 통계치를 체크하는데 사용될 수도 있다. 본 개시물의 기법들은 또한, 타임스탬프 쿼리들, 파이프라인 스테이터스 쿼리들 (파이프라인 통계), 및 다른 타입들의 쿼리들에 적용될 수도 있다.
전술된 바와 같이, 그래픽 프로세싱 시스템들은, 예를 들어 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서의 다른 오브젝트들에 의해 가려지거나 가려지지 않는지를 결정하기 위해 차폐 쿼리들을 사용할 수도 있다. 다시 말해, 그래픽 프로세싱 시스템들은, 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서 다른 오브젝트들에 의해 블록킹되어 그것이 보여질 수 없는지 또는 렌더링될 오브젝트가 그래픽 장면 (또는 타일) 에서 다른 오브젝트들에 의해 블록킹되지 않아 그것이 보여질 수 있는지를 결정하기 위해 차폐 쿼리들을 사용할 수도 있다. 일부 예들에서, 오브젝트들은 블록킹되고, 부분적으로 블록킹되거나 또는 가시적일 수도 있다. 그래픽 프로세서는 이 정보를 사용하여 더 효율적인 렝더링을 할 수도 있다. 예를 들어, 오브젝트들을 가려지게, 즉 그들이 보여질 수 없도록 블록킹되게 만들지 않음으로써 프로세싱 리소스들이 보존될 수도 있으며, 타일의 렌더링을 더 효율적으로 만든다. 가려지지 않는 오브젝트들은 렌더링될 수도 있다. 일부 예들에서, 부분적으로 가려지는 오브젝트들이 렌더링될 수도 있다. 다른 예들에서, 부분적으로 가려지는 오브젝트들이 렌더링되지 않을 수도 있다. 부분적으로 가려진 오브젝트들은 부분적으로 렌더링되거나 또는 더욱 더 작은 오브젝트들로 부서지고 재-테스트될 수도 있다. 그러나, 일부 포인트는 일반적으로 추가의 차폐 쿼리들을 수행하는데 더 많은 프로세싱 리소스들을 소비하기 보다는 오브젝트의 가시적 부분 또는 오브젝트를 단순히 렌더링하기 위해 프로세싱 리소스들의 사용의 관점들에서 더 유리할 것임이 이해될 것이다. 가려진 오브젝트들의 렌더링은, 예를 들어 얼마나 많은 오브젝트가 가려지는지에 의존할 수도 있다.
그래픽 프로세싱은 디스플레이 또는 렌더링될 프레임과 같은 출력을 나타내는 프리미티브들 (폴리곤들, 예를 들어 삼각형들) 의 세트를 정의함으로써 수행될 수도 있다. 렌더 출력의 각각의 프리미티브는 대개, 정점들의 세트로서 정의 및 표현되고, 각각의 정점은 그 정점에 대한 데이터 값들의 세트와 연관된다.
출력을 위한 프리미티브들은 그 후, 래스터화되어 렌더링된 출력을 생성하기 위해 추가로 프로세싱될 수도 있는 복수의 이산 그래픽 엔티티들을 생성할 수도 있다. 이들 이산 그래픽 엔티티들은 픽셀들일 수도 있다. 그러나, 이산 그래픽 엔티티들은 항상, 렌더 출력에서 단일 픽셀에 정확하게 대응하지 않을 수도 있다. 이것은, 예를 들어 다운-스케일링 때문이다.
차폐 쿼리들은 통상적으로, 이산 그래픽 엔티티들, 예를 들어 가시적인 소정의 오브젝트 또는 오브젝트들에 대한 픽셀들, 샘플 등의 수를 카운트하고, 이 카운트를 사용하여 이산 그래픽 엔티티들로부터 형성된 오브젝트 또는 오브젝트들이 가시적인지, 오브젝트 또는 오브젝트들의 부분들이 가시적인지 또는 양자 모두인지를 결정한다. 다양한 메커니즘들은 얼마나 많은 그래픽 엔티티들, 예컨대 픽셀들 또는 샘플들이 래스터화되었는지의 결정을 허용한다.
통상의 차폐 쿼리 시퀀스는 (1) 차폐 쿼리의 시작, (2) 하나 이상의 오브젝트들의 드로잉, (3) 차폐 쿼리의 종료, 및 (4) 얼마나 많은 샘플들이 렌더링되었는지의 결과들의 획득을 포함할 수도 있다. 차폐 쿼리와 같은 쿼리에서 타일-당 중간 결과들을 저장하는데 필요한 메모리의 양은 타일들의 수에서의 증가와 선형적으로 증가할 수도 있다. 타일들의 수에서의 증가는 또한, 예를 들어 최종 쿼리 결과가 요청될 때 누산을 행하도록 CPU 에 의해 취해진 시간의 양을 증가시킨다. 일 예에서, 이러한 쿼리들을 수행하기 위해 더 메모리 효율적인 방식은 쿼리의 시작에서 러닝 카운터 (running counter) 를 판독하여 시작 값을 결정할 수도 있고, 여기서 러닝 카운터는 렌더링된 샘플들을 카운트하고, 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정하고 동일한 시작 카운터 및 종료 카운터 메모리 로케이션들을 재-사용하는 빈/타일마다 이 동작을 수행한다. 예들은 타일-기반 렌더러들에 대한 차폐 쿼리 프로세싱에 관련되어 본원에 논의된다. 그러나, 다른 예들에서 다른 타입들의 쿼리들, 예컨대 타임스탬프 쿼리, 파이프라인 스테이터스 쿼리 (파이프라인 통계) 및 다른 타입들의 쿼리들이 이들 기법들을 사용하여 프로세싱될 수도 있음이 이해될 것이다.
도 1 은 본 개시물의 쿼리 프로세싱 기법들을 구현하는데 사용될 수도 있는 예시의 컴퓨팅 디바이스 (2) 를 예시하는 블록도이다. 컴퓨팅 디바이스 (2) 는 퍼스널 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔, 무선 통신 디바이스 (예컨대, 모바일 전화기, 셀룰러 전화기, 위성 전화기, 및/또는 모바일 전화기 핸드셋), 지상통신 전화기, 인터넷 전화기, 핸드헬드 디바이스, 예컨대 휴대용 비디오 게임 디바이스 또는 개인 휴대정보 단말기 (PDA), 퍼스널 뮤직 플레이어, 비디오 플레이어, 디스플레이 디바이스, 텔레비전, 텔레비전 셋-톱 박스, 서버, 중간 네트워크 디바이스, 메인프레임 컴퓨터 또는 그래픽 데이터를 프로세싱 및/또는 디스플레이하는 임의의 다른 타입의 디바이스를 포함할 수도 있다.
일부 예들에서, 예를 들어 컴퓨팅 디바이스 (2) 가 퍼스널 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔을 포함하는 경우, 예를 들어 컴퓨팅 디바이스는 비디오 디스플레이 상에 디스플레이를 위한 비디오 데이터를 프로세싱할 때 타일-기반 렌더러에 대한 쿼리 프로세싱을 수행할 수도 있다.
컴퓨팅 디바이스 (2) 가 무선 통신 디바이스 또는 다른 유사한 디바이스이면, 그것은 음성 통신 데이터, 비디오 데이터, 텍스트 메시지들, 데이터 파일들, 및 데이터의 비트 스트림들로서 송신 또는 수신될 수도 있는 다른 형태들의 데이터와 같은 데이터의 하나 이상의 비트 스트림들을 코딩할 수도 있다. 비트 스트림은 시간 시리즈들 또는 비트들의 시퀀스일 수도 있다. 유사하게, 바이트 스트림은 일련의 바이트들, 예를 들어 8 비트들 각각일 수도 있다. 본원에 사용된 바와 같이, 비트 스트림은 바이트 스트림을 포함할 수도 있다. 예를 들어, 바이트 스트림은 비트 스트림의 특수 케이스로서 간주될 수도 있다. (바이트 스트림은 비트 스트림이고, 여기서 데이터 비트들은 바이트들로서 지칭된 유닛들로 그룹화된다.)
컴퓨팅 디바이스 (2) 는, 예를 들어 비디오 데이터의 비트 스트림을 수신하고 예를 들어 비디오 디스플레이 상에 렌더링을 위해 그러한 비트 스트림들 프로세싱할 때 타일-기반 렌더러에 대한 쿼리 프로세싱을 수행할 수도 있다.
도 1 의 예에 예시된 바와 같이, 컴퓨팅 디바이스 (2) 는 사용자 인터페이스 (4), 중앙 처리 장치 (CPU)(6), 메모리 제어기 (8), 메모리 (10), 그래픽 프로세싱 유닛 (GPU)(12), 디스플레이 인터페이스 (14), 디스플레이 (16) 및 버스 (18) 를 포함한다. 사용자 인터페이스 (4), CPU (6), 메모리 제어기 (8), GPU (12) 및 디스플레이 인터페이스 (14) 는 버스 (18) 를 사용하여 서로와 통신할 수도 있다. 도 1 에 도시된 상이한 컴포넌트들 간의 통신 인터페이스들 및 버스들의 특정 구성은 단지 예시적이며, 동일한 또는 상이한 컴포넌트들을 갖는 컴퓨팅 디바이스들 및/또는 다른 그래픽 프로세싱 시스템들의 다른 구성들은 본 개시물의 기법들을 구현하는데 사용될 수도 있음이 주목된다.
일부 예들에서, 컴퓨팅 디바이스 (2) 에서의 프로세서, 예컨대 CPU (6), GPU (12), 또는 다른 프로세싱 회로부는 컴퓨팅 디바이스 (2) 상에서 그래픽 프로세싱의 부분으로서 쿼리들을 수행할 수도 있다. 예를 들어, 프로세서는 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정할 수도 있다. 러닝 카운터는 이산 그래픽 엔티티들, 예컨대 픽셀들, 샘플들, 폴리곤들 등을 카운트할 수도 있다. 프로세서는 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정할 수도 있다. 프로세서는 또한, 이 종료 값으로부터 시작 값을 감산하여 결과를 결정할 수도 있다.
CPU (6) 는 컴퓨팅 디바이스 (2) 의 동작을 제어하는 범용 또는 특수-목적의 프로세서를 포함할 수도 있다. 사용자는 컴퓨팅 디바이스 (2) 에 입력을 제공하여, CPU (6) 로 하여금 하나 이상의 소프트웨어 애플리케이션들을 실행하게 할 수도 있다. CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은, 예를 들어 그래픽 애플리케이션, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 확산 시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션, 운영 시스템, 또는 임의의 다른 타입의 프로그램을 포함할 수도 있다. 사용자는 하나 이상의 입력 디바이스들 (미도시), 예컨대 키보드, 마우스, 마이크로폰, 터치 패드 또는 사용자 인터페이스 (4) 를 통해 컴퓨팅 디바이스 (2) 에 커플링되는 다른 입력 디바이스를 통해 컴퓨팅 디바이스 (2) 에 입력을 제공할 수도 있다.
CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들은 디스플레이 (16) 상에 디스플레이를 위해 프레임 버퍼로 그래픽 데이터를 렌더링하도록 GPU (12) 에 명령하는 하나 이상의 그래픽 렌더링 명령들을 포함할 수도 있다. 일부 예들에서, 그래픽 렌더링 명령들은 그래픽 애플리케이션 프로그래밍 인터페이스 (API), 예컨대 오픈 그래픽 라이브러리 (OpenGL®) API, 오픈 그래픽 라이브러리 임베디드 시스템들 (OpenGL ES) API, Direct3D API, X3D API, RenderMan API, WebGL API, 또는 임의의 다른 공용 또는 사설 표준 그래픽 API 를 따를 수도 있다. 그래픽 렌더링 명령들을 프로세싱하기 위해, CPU (6) 는 GPU (12) 에 하나 이상의 그래픽 렌더링 커맨드들을 발행하여, GPU (12) 로 하여금 그래픽 데이터의 렌더링의 일부 또는 전부를 수행하게 한다. 일부 예들에서, 렌더링될 그래픽 데이터는 그래픽 프리미티브들, 예를 들어 포인트들, 라인들, 삼각형들, 사변형들, 삼각형 스트라이프들 등의 리스트를 포함할 수도 있다.
일부 예들에서, CPU (6) 는 시작 값을 결정하기 위해 쿼리의 시작에서 이산 그래픽 엔티티들을 카운트할 수도 있는 러닝 카운터를 판독하게 하도록 소프트웨어를 실행할 수도 있다. CPU (6) 는 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하고, 종료 값으로부터 시작 값을 감산하여 결과를 결정할 수도 있다. 일부 예들에서, 이산 그래픽 엔티티들은 픽셀들일 수도 있다. 일부 다른 예들에서, 이산 그래픽 엔티티들은 폴리곤들일 수도 있다.
메모리 제어기 (8) 는 메모리 (10) 의 안팎으로 가는 데이터의 전송을 용이하게 한다. 예를 들어, 메모리 제어기 (8) 는 메모리 판독 및 기입 커맨드들을 수신하고, 컴퓨팅 디바이스 (2) 에서 컴포넌트들에 대한 메모리 서비스들을 제공하기 위한 순서로 메모리 (10) 에 대하여 이러한 커맨드들을 서비스할 수도 있다. 메모리 제어기 (8) 는 메모리 (10) 에 통신적으로 커플링된다. 메모리 제어기 (8) 는 도 1 의 예시의 컴퓨팅 디바이스 (2) 에서 CPU (6) 및 메모리 (10) 양자 모두로부터 별개인 프로세싱 모듈인 것으로 예시되었으나, 다른 예들에서 메모리 제어기 (8) 의 기능의 일부 또는 전부가 CPU (6) 및 메모리 (10) 중 하나 또는 양자 모두 상에서 구현될 수도 있다.
메모리 (10) 는 CPU (6) 상에서 실행되는 프로그램들에 의한 사용을 위해 데이터 및/또는 CPU (6) 에 의한 실행을 위해 액세스 가능한 명령들 및/또는 프로그램 모듈들을 저장할 수도 있다. 예를 들어, 메모리 (10) 는 CPU (6) 상에서 실행되는 애플리케이션들과 연관된 프로그램 코드 및 그래픽 데이터를 저장할 수도 있다. 메모리 (10) 는 부가적으로, 컴퓨팅 디바이스 (2) 의 다른 컴포넌트들에 의해 생성되고/되거나 사용을 위해 정보를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 GPU (12) 에 대한 디바이스 메모리로서 작용하고, GPU (12) 상에서 동작될 데이터 뿐만 아니라 GPU (12) 에 의해 수행된 동작들로부터 비롯되는 데이터를 저장할 수도 있다. 예를 들어, 메모리 (10) 는 텍스처 버퍼들, 심도 버퍼들, 스텐실 버퍼들, 정점 버퍼들, 프레임 버퍼들, 렌더 타겟들 등의 임의의 조합을 저장할 수도 있다. 또한, 메모리 (10) 는 GPU (12) 에 의한 프로세싱을 위해 커맨드 스트림들을 저장할 수도 있다. 메모리 (10) 는 하나 이상의 휘발성 또는 비휘발성 메모리들 또는 저장 디바이스들, 예컨대 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM), 판독-전용 메모리 (ROM), 소거가능 프로그램가능 ROM (EPROM), 전기적으로 소거가능 프로그램가능 ROM (EEPROM), 플래시 메모리, 자기 데이터 매체 또는 광학 저장 매체를 포함할 수도 있다.
GPU (12) 는 CPU (6) 에 의해 GPU (12) 로 발행되는 커맨드들을 실행하도록 구성될 수도 있다. GPU (12) 에 의해 실행된 커맨드들은 그래픽 커맨드들, 드로우 콜 (draw call) 커맨드들, GPU (12) 상태 프로그래밍 커맨드들, 타임스탬프 요청들, 메모리 전송 커맨드들, 범용 컴퓨팅 커맨드들, 커널 실행 (kernel execution) 커맨드들 등을 포함할 수도 있다.
일부 예들에서, GPU (12) 는 하나 이상의 그래픽 프리미티브들을 디스플레이 (16) 로 렌더링하기 위한 그래픽 동작들을 수행하도록 구성될 수도 있다. 이러한 예들에서, CPU (6) 상에서 실행하는 소프트웨어 애플리케이션들 중 하나가 그래픽 프로세싱을 요구하는 경우, CPU (6) 는 디스플레이 (16) 로의 렌더링을 위한 GPU (12) 에 그래픽 데이터를 제공하고, 하나 이상의 그래픽 커맨드들을 GPU (12) 로 발행할 수도 있다. 그래픽 커맨드들은, 예를 들어 드로우 콜 커맨드들, GPU (12) 상태 프로그래밍 커맨드들, 메모리 전송 커맨드들, 블릿팅 (blitting) 커맨드들 등을 포함할 수도 있다. 그래픽 데이터는 정점 버퍼들, 텍스처 데이터, 표면 데이터 등을 포함할 수도 있다. 일부 예들에서, CPU (6) 는, GPU (12) 에 의해 액세스될 수도 있는, 메모리 (10) 에 커맨드들 및 그래픽 데이터를 기입함으로써 GPU (12) 에 커맨드들 및 그래픽 데이터를 제공할 수도 있다.
일부 예들에서, CPU (6) 보다는 GPU (12) 가 시작 값을 결정하기 위해 쿼리의 시작에서 이산 그래픽 엔티티들을 카운트할 수도 있는 러닝 카운터를 판독하게 하도록 소프트웨어를 실행할 수도 있다. GPU (12) 는 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하고, 종료 값으로부터 시작 값을 감산하여 결과를 결정할 수도 있다. 다른 예에서, 쿼리 결과는 GPU (12) 에 의해 타일 마다 출력되고 이후에 CPU (6) 에 의해 누산될 수도 있다.
추가의 예들에서, GPU (12) 는 CPU (6) 상에서 실행되는 애플리케이션들에 대한 범용 컴퓨팅을 수행하도록 구성될 수도 있다. 이러한 예들에서, CPU (6) 상에서 실행되는 소프트웨어 애플리케이션들 중 하나가 계산적 태스크를 GPU (12) 로 오프-로드하기를 결정하는 경우, CPU (6) 는 범용 컴퓨팅 데이터를 GPU (12) 에 제공하고, 하나 이상의 범용 컴퓨팅 커맨드들을 GPU (12) 에 발행할 수도 있다. 범용 컴퓨팅 커맨드들은, 예를 들어 커널 실행 커맨드들, 메모리 전송 커맨드들 등을 포함할 수도 있다. 일부 예들에서, CPU (6) 는, GPU (12) 에 의해 액세스될 수도 있는, 메모리 (10) 에 커맨드들 및 그래픽 데이터를 기입함으로써 GPU (12) 에 커맨드들 및 범용 컴퓨팅 데이터를 제공할 수도 있다.
GPU (12) 는, 일부 경우들에서 CPU (6) 보다 더 효율적인 벡터 동작들의 프로세싱을 제공하는 고도-병렬 (highly-parallel) 구조로 구축될 수도 있다. 예를 들어, GPU (12) 는 다수의 정점들, 제어 포인트들, 픽셀들 및/또는 다른 데이터 상에서 병렬 방식으로 동작하도록 구성되는 복수의 프로세싱 엘리먼트들을 포함할 수도 있다. GPU (12) 의 고도 병렬 성질은, 일부 예들에서 GPU (12) 가 그래픽 이미지들 (예를 들어, GUI들 및 2 차원 (2D) 및/또는 3 차원 (3D) 그래픽 장면들) 을 디스플레이 (16) 상에, CPU (6) 를 사용하여 이미지들을 렌더링하는 것보다 더 빨리 렌더링하는 것을 허용한다. 또한, GPU (12) 의 고도 병렬 성질은, GPU (12) 가 CPU (6) 보다 더 빠르게 범용 컴퓨팅 애플리케이션들에 대한 벡터 및 매트릭스 동작들의 소정 타입들을 프로세싱하는 것을 허용할 수도 있다.
GPU (12) 는, 일부 경우들에서 컴퓨팅 디바이스 (2) 의 마더보드 안에 통합될 수도 있다. 다른 경우들에서, GPU (12) 는 컴퓨팅 디바이스 (2) 의 마더보드에서의 포트에 인스톨되는 그래픽 카드 상에 존재할 수도 있거나, 그렇지 않으면 컴퓨팅 디바이스 (2) 와 상호동작하도록 구성된 주변 디바이스 내에 통합될 수도 있다. 추가의 경우들에서, GPU (12) 는 시스템 온 칩 (SoC) 을 형성하는 CPU (6) 로서 동일한 마이크로칩 상에 위치될 수도 있다. GPU (12) 는 하나 이상의 프로세서들, 예컨대 하나 이상의 마이크로프로세서들, 주문형 집적 회로들 (ASICs), 필드 프로그램가능 게이트 어레이들 (FPGAs), 디지털 신호 프로세서들 (DSPs), 또는 다른 등가의 집적된 또는 이산 로직 회로부를 포함할 수도 있다.
일부 예들에서, GPU (12) 는 GPU 캐시를 포함할 수도 있고, 이 캐시는 메모리 (10) 의 전부 또는 일부에 대한 캐싱 서비스들을 제공할 수도 있다. 이러한 예들에서, GPU (12) 는 오프-칩 메모리 대신에, 로컬 스토리지를 국부적으로 사용하여 데이터를 프로세싱하도록 캐시를 사용할 수도 있다. 이것은, 각각의 판독 및 기입 커맨드 동안, 심한 버스 트래픽을 경험할 수도 있는, GPU (12) 가 버스 (18) 를 통해 메모리 (10) 에 액세스할 필요성을 감소시킴으로써 GPU (12) 가 더 효율적인 방식으로 동작하는 것을 허용한다. 그러나, 일부 예들에서 GPU (12) 는 별개의 캐시를 포함하지 않고, 대신에 버스 (18) 를 통해 메모리 (10) 를 이용할 수도 있다. GPU 캐시는 하나 이상의 휘발성 또는 비-휘발성 메모리들 또는 저장 디바이스들, 예컨대 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM) 등을 포함할 수도 있다.
CPU (6), GPU (12), 또는 양자 모두는 메모리 (10) 내에 할당되는 프레임 버퍼에 래스터화된 이미지 데이터를 저장할 수도 있다. 디스플레이 인터페이스 (14) 는 프레임 버퍼로부터 데이터를 취출하고, 래스터화된 이미지 데이터에 의해 표현된 이미지를 디스플레이하도록 디스플레이 (16) 를 구성할 수도 있다. 일부 예들에서, 디스플레이 인터페이스 (14) 는 프레임 버퍼로부터 취출된 디지털 값들을 디스플레이 (16) 에 의해 소비 가능한 아날로그 신호로 변환하도록 구성되는 디지털-대-아날로그 컨버터 (DAC) 를 포함할 수도 있다. 다른 예들에서, 디스플레이 인터페이스 (14) 는 프로세싱을 위해 디지털 값들을 디스플레이 (16) 로 직접 패스할 수도 있다.
디스플레이 (16) 는 모니터, 텔레비전, 프로젝션 디바이스, 액정 디스플레이 (LCD), 플라즈마 디스플레이 패널, 발광 다이오드 (LED) 어레이, 음극선관 (CRT) 디스플레이, 전자 페이퍼, 표면-전도 전자-방출 디스플레이 (SED), 레이저 텔레비전 디스플레이, 나노크리스탈 디스플레이 또는 다른 타입의 디스플레이 유닛을 포함할 수도 있다. 디스플레이 (16) 는 컴퓨팅 디바이스 (2) 내에 통합될 수도 있다. 예를 들어, 디스플레이 (16) 는 모바일 전화기 핸드셋 또는 태블릿 컴퓨터의 스크린일 수도 있다. 대안으로, 디스플레이 (16) 는 유선 또는 무선 통신 링크를 통해 컴퓨터 디바이스 (2) 에 커플링된 독립형 디바이스일 수도 있다. 예를 들어, 디스플레이 (16) 는 케이블 또는 무선 링크를 통해 퍼스널 컴퓨터에 접속된 플랫 패널 디스플레이 또는 컴퓨터 모니터일 수도 있다.
버스 (18) 는 제 1, 제 2 및 제 3 세대 버스 구조들 및 프로토콜들, 공유된 버스 구조들 및 프로토콜들, 포인트-대-포인트 버스 구조들 및 프로토콜들, 단방향 버스 구조들 및 프로토콜들, 및 양방향 버스 구조들 및 프로토콜들을 포함하는 버스 구조들 및 버스 프로토콜들의 임의의 조합을 사용하여 구현될 수도 있다. 버스 (18) 를 구현하는데 사용될 수도 있는 상이한 버스 구조들 및 프로토콜들의 예들은, 예를 들어 하이퍼트랜스포트 버스, 인피니밴드 (InfiniBand) 버스, 어드밴스드 그래픽 포토 버스, PCI (Peripheral Component Interconnect) 버스, PCI 익스프레스 버스, 어드밴스드 마이크로제어기 버스 아키텍처 (AMBA) 어드밴스드 고-성능 버스 (AHB), AMBA 어드밴스드 주변 버스 (Advanced Peripheral Bus; APB), 및 AMBA AXI (Advanced eXentisible Interface) 버스를 포함한다. 다른 타입들의 버스 구조들 및 프로토콜들이 또한, 사용될 수도 있다.
본 개시물에 설명된 기법들은, 일부 예들에서 예를 들어 CPU (6), GPU (12), 및 시스템 메모리 (10) 를 포함하는 도 1 에 예시된 컴퓨팅 디바이스 (2) 에서의 컴포넌트들 중 어느 하나에서 구현될 수도 있다. 일부 예들에서, 본 개시물의 차폐 쿼리 기법들은 GPU (12) 및 메모리 (10) 를 사용하여 구현될 수도 있다. 일부 예들에서, 본 개시물의 기법들은 GPU (12) 에서 전체적으로 구현될 수도 있다. 일부 예들에서, 본 개시물에 설명된 기법들은 이들 컴포넌트들의 조합을 사용하여 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하고 쿼리의 종료에서 종료 값을 결정하도록 구현될 수도 있다. 이들 컴포넌트들 중 하나 이상은 종료 값으로부터 시작 값을 감산하여 결과를 결정하는데 사용될 수도 있다.
도 2 는 도 1 에서 컴퓨팅 디바이스 (2) 의 CPU (6), GPU (12) 및 메모리 (10) 를 더 상세히 예시하는 블록도이다. 본 개시물에 설명된 기법들은, 일부 예들에서 도 2 에 예시된 컴포넌트들 중 어느 하나에서 구현될 수도 있다. 도 2 에 도시된 바와 같이, CPU (6) 는 GPU (12) 및 메모리 (10) 에 통신적으로 커플링되고, GPU (12) 는 CPU (6) 및 메모리 (10) 에 통신적으로 커플링된다. GPU (12) 는, 일부 예들에서 CPU (6) 와 마더보드 상에 통합될 수도 있다. 추가의 예들에서, GPU (12) 는 CPU (6) 를 포함하는 마더보드의 포트에 인스톨되는 그래픽 카드 상에서 구현될 수도 있다. 추가의 예들에서, GPU (12) 는 CPU (6) 와 상호동작하도록 구성되는 주변 디바이스 내에 통합될 수도 있다. 추가의 예들에서, GPU (12) 는 시스템 온 칩 (SoC) 을 형성하는 CPU (6) 와 동일한 마이크로칩 상에 위치될 수도 있다.
CPU (6) 는 소프트웨어 애플리케이션 (24), 그래픽 API (26), GPU 드라이버 (28) 및 운영 시스템 (30) 중 어느 하나를 실행하도록 구성되는 하나 이상의 프로세서들 (예를 들어, 마이크로프로세서들) 을 포함할 수도 있다. 일부 예들에서, CPU (6) 는 CPU (6) 의 하나 이상의 프로세서들로 하여금 본 개시물에 설명된 기법들 중 임의의 것의 전부 또는 일부를 수행하게 하는 명령들을 실행하도록 구성될 수도 있다.
GPU (12) 는 커맨드 엔진 (32), 하나 이상의 프로세싱 유닛들 (34), 및 타일-기반 렌더링 버퍼 (36) 를 포함한다. 하나 이상의 프로세싱 유닛들 (34) 은 3D 그래픽 렌더링 파이프라인을 형성하도록 구성될 수도 있다. 일부 예들에서, 프로세싱 유닛들 (34) 중 하나 이상은 온-칩, 테셀레이션-가능 (tessellation-enabled) 그래픽 렌더링 파이프라인을 구현할 수도 있다. 커맨드 엔진 (32) 및 프로세싱 유닛들 (34) 은 이러한 컴포넌트들에 부여된 기능들을 수행하도록 구성되는 전용 하드웨어 유닛들, 펌웨어, 소프트웨어, 및 프로세서들의 임의의 조합을 포함할 수도 있다. 일부 예들에서, GPU (12) 는 GPU (12) 의 하나 이상의 프로세서들로 하여금 본 개시물에 설명된 기법들 중 임의의 것의 전부 또는 일부를 수행하게 하는 명령들을 실행하도록 구성될 수도 있다.
메모리 (10) 는 하나 이상의 커맨드들 (38), 프리미티브 데이터 (40), 및 타임스탬프 데이터 (42) 를 저장할 수도 있다. 일부 예들에서, 메모리 (10) 는 또한, 실행되는 경우 하나 이상의 프로세서들로 하여금 본 개시물에 설명된 기법들 중 임의의 것의 전부 또는 일부를 수행하게 하는 명령들을 저장할 수도 있다.
도 2 는 또한, 이산 그래픽 엔티티들을 카운트할 수도 있는 예시의 카운터 (44) 를 예시한다. 프로세서, 예컨대 GPU (12) 또는 CPU (6) 는 그것으로 하여금 쿼리의 시작에서 카운터 (44) 를 판독하여 시작 값을 결정하고, 쿼리의 종료에서 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정하게 하는 소프트웨어를 실행할 수도 있다. 다양한 예들에서, GPU (12) 또는 CPU (6) 는 카운터 (44) 로부터 판독된 값들을 저장하도록 메모리 (10) 를 사용할 수도 있다. 다른 예들에서, GPU (12) 또는 CPU (6) 또는 다른 메모리 (미도시) 내의 레지스터들이 사용될 수도 있다. 예를 들어, 카운터 (44) 는 메모리 또는 다른 스토리지를 포함할 수도 있다.
도 2 의 예시된 예에서, 카운터 (44) 는 버스 (18) 에 접속되고, 이로써 예를 들어 GPU (12) 또는 CPU (6) 에 의해 액세스될 수도 있다. 다른 예들에서, 카운터 (44) 는 메모리 (10) 의 부분이거나 CPU (6) 또는 GPU (12) 에서 구현될 수도 있다. 일반적으로, 모든 쿼리 타입들에 대한 쿼리 카운터들은 하드웨어에 의해 유지된다. 따라서, 일반적으로 카운터 값들을 메모리에 기입하도록 GPU (12) 에 명령할 필요가 있고, 이것 후에 CPU (6) 는 그것에 액세스할 수 있다. 일부 예들에서, 소프트웨어 쿼리 카운터들이 사용되지 않는다. 이러한 예들에서, 모든 쿼리 타입들에 대한 카운터 값들은 하드웨어에서 유지될 수도 있고, 하드웨어 커맨드들이 사용되어 이들 카운터 값들로 하여금 메모리에 기입되게 할 수도 있다. 그러나, 다른 예들은 상이한 카운터 구성들, 예컨대 소프트웨어 카운터들 또는 하드웨어와 소프트웨어 카운터들의 조합을 사용할 수도 있다.
다른 프로세싱 리소스들 (미도시) 이 사용되어, 쿼리의 시작에서 카운터 (44) 를 판독하여 시작 값을 결정하고 쿼리의 종료에서 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정함으로써 본 개시물의 기법들을 구현할 수 있는 것으로 이해될 것이다.
본원에 설명된 기법들이 도 2 의 시스템을 사용하여 어떻게 구현될 수 있는지의 일 특정 예에서, GPU (12) 는 그것으로 하여금 쿼리의 시작에서 카운터 (44) 를 판독하여 시작 값을 결정하도록 하는 소프트웨어를 실행할 수도 있다. 이 시작 값은 메모리 (10) 에 저장될 수도 있다. GPU (12) 는 그 후, 쿼리의 종료에서 카운터 (44) 를 판독하여 종료 값을 결정할 수도 있다. 이 종료 값은 메모리에 저장된 시작 값들로부터 감산되어 결과를 결정할 수도 있다. 이 종료 값은 그것이 판독된 후에 GPU (12) 내의 레지스터에 또는 메모리 (10) 에 저장될 수도 있다. 시작 값은 메모리 (10) 로부터 판독되고, 그 후 레지스터에 저장된 종료 값으로부터 감산될 수도 있다.
일부 예들에서, 쿼리 카운터는 GPU 에 의해 유지될 수도 있다. GPU 에 의해 실행된 명령들은 이러한 카운터 값들을 메모리 (10) 에 기입할 수도 있고, 메모리에서 이들 카운터 값들은 그 후, CPU (6) 에 의해 액세스될 수도 있다. 본원에 설명된 기법들이 도 2 의 시스템을 사용하여 어떻게 구현될 수 있는지의 다른 특정 예에서, CPU (6) 는 그것으로 하여금 쿼리의 시작에서 카운터 (44) 를 판독하여 시작 값을 결정하도록 하는 소프트웨어를 실행할 수도 있다. 이 시작 값은 메모리 (10) 에 저장될 수도 있다. CPU (6) 는 그 후, 쿼리의 종료에서 카운터 (44) 를 판독하여 종료 값을 결정할 수도 있다. 이 종료 값은 메모리에 저장된 시작 값들로부터 감산되어 결과를 결정할 수도 있다. 종료 값은 그것이 판독된 후에 CPU (6) 내의 레지스터에 또는 메모리 (10) 에 저장될 수도 있으나, 일반적으로 CPU (6) 에서의 레지스터가 사용될 것이다. 시작 값은 메모리 (10) 로부터 판독되고, 그 후 레지스터에 저장된 종료 값으로부터 감산될 수도 있다.
도 2 에 예시된 예에서, 프로세서 (예를 들어, CPU (6) 또는 GPU (12)), 메모리 (10), 및 카운터 (44) 는 각각 버스 (18) 에 어태치된 각각의 별개의 논리 블록들이다. 다른 예들 (미도시) 에서, 프로세서, 메모리, 및 카운터의 기능들 중 하나 이상은 단일의 기능 블록을 사용하여 수행될 수도 있다. 예를 들어, 프로세서는 쿼리의 시작에서 카운터를 판독하여 시작 값을 결정하고, 그 시작 값을 단일의 기능 블록 내의 메모리에 저장하고, 쿼리의 종료에서 카운터 (44) 를 판독하여 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정하도록, 버스 (18) 에 어태치될 수도 있는 단일의 기능 블록에 명령할 수도 있다. 종료 값은 그 후, 프로세서로 리턴되는 유일한 것일 수도 있다. 다른 예들에서, 프로세서는 쿼리의 시작 및 종료를 기능 블록에 나타낼 수도 있고, 기능 블록은 결과를 리턴할 수도 있다.
도 2 에 예시된 장치는 본원에 설명된 시스템들 및 방법들에 따라 다양한 쿼리들을 수행할 수도 있다. 예를 들어, 도 7 및 도 5 내지 도 6 의 메모리 맵들에 대하여 더 상세히 예시되었기 때문에, 도 2 의 장치는 2 개의 쿼리들, 쿼리 ABC 및 쿼리 BC 는 서로 네스팅 (nest) 되어 수행할 수도 있다. 이러한 쿼리에서, 먼저 3 개의 메모리 로케이션들은 쿼리 ABC 에 대해 0 으로 리셋될 수도 있다.
소프트웨어 애플리케이션 (24) 은 하나 이상의 3D 그래픽 장면들 및/또는 3D 그래픽 오브젝트들을 디스플레이 상에 디스플레이될 이미지로 렌더링하기 위해 GPU (12) 를 사용하는 그래픽 애플리케이션일 수도 있다. 소프트웨어 애플리케이션 (24) 은 GPU (12) 로 하여금 3D 그래픽 프리미티브들의 세트를 래스터화 및 렌더링하게 하는 명령들을 포함할 수도 있다. 소프트웨어 애플리케이션 (24) 은 그래픽 API (26) 를 통해 GPU 드라이버 (28) 에 명령들을 발행할 수도 있다. 그래픽 API (26) 는, 소프트웨어 애플리케이션 (24) 으로부터 수신된 명령들을 GPU 드라이버 (28) 에 의해 소비 가능한 포맷으로 트랜스레이트하는 런타임 서비스일 수도 있다.
GPU 드라이버 (28) 는 그래픽 API (26) 를 통해 소프트웨어 애플리케이션 (24) 으로부터 명령들을 수신하고, GPU (12) 의 동작을 제어하여 명령들을 서비스한다. 예를 들어, GPU (28) 는 하나 이상의 커맨드들 (38) 을 포뮬레이팅하고, 이 커맨드들 (38) 을 메모리 (10) 에 배치하며, 커맨드들 (38) 을 실행하도록 GPU (12) 에 명령할 수도 있다. 일부 예들에서, GPU 드라이버 (28) 는 커맨드들 (38) 을 메모리 (10) 에 배치하고, 운영 시스템 (30) 을 통해, 예를 들어 하나 이상의 시스템 호출들을 통해 GPU (12) 와 통신할 수도 있다.
운영 시스템 (30) 은 소프트웨어 플랫폼을 제공할 수도 있고, 이 플랫폼 상에서 소프트웨어 애플리케이션 (24), 그래픽 API (26), 및 GPU 드라이버 (28) 가 실행된다. 운영 시스템 (30) 은 CPU (6), 메모리 (10) 및 GPU (12) 간의 데이터의 통신 및 전송의 하드웨어 상세들을 관리할 수도 있다.
커맨드들 (38) 은 하나 이상의 상태 커맨드들, 하나 이상의 드로우 콜 커맨드들 및/또는 하나 이상의 타임스탬프 요청들을 포함할 수도 있다. 상태 커맨드는 GPU (12) 에서의 상태 변수들 중 하나 이상, 예컨대 프리미티브 타입을 변경하도록 GPU (12) 에 명령할 수도 있다. 드로우 콜 커맨드는 메모리 (10) 에 저장된 하나 이상의 정점들의 그룹에 의해 정의된 (예를 들어, 정점 버퍼에 정의된) 지오메트리를 렌더링하도록 GPU (12) 에 명령할 수도 있다. 하나 이상의 정점들의 그룹에 의해 정의된 지오메트리는, 일부 예들에서 렌더링될 복수의 프리미티브들 (예를 들어, 프리미티브 데이터 (40)) 에 대응할 수도 있다. 일반적으로, 드로우 콜 커맨드는 메모리 (10) 의 정의된 섹션 (예를 들어, 버퍼) 에 저장된 정점들의 전부를 렌더링하도록 GPU (12) 를 인보크할 수도 있다. 다시 말해, 일단 GPU (12) 가 드로우 콜 커맨드를 수신하면, 메모리 (10) 의 정의된 섹션 (예를 들어, 버퍼) 에서 정점들에 의해 표현된 프리미티브들 및 지오메트리를 렌더링하기 위해 제어가 GPU (12) 로 패스된다.
프로세싱 유닛들 (34) 은 하나 이상의 프로세싱 유닛들을 포함할 수도 있고, 이들 각각은 프로그램가능 프로세싱 유닛 또는 고정된-기능 프로세싱 유닛일 수도 있다. 프로그램가능 프로세싱 유닛은, 예를 들어 CPU (6) 로부터 GPU (12) 로 다운로드되는 하나 이상의 쉐이더 프로그램들을 실행하도록 구성되는 프로그램가능 쉐이더 유닛을 포함할 수도 있다. 쉐이더 프로그램은, 일부 예들에서 하이-레벨 쉐이딩 언어, 예컨대 OpenGL 쉐이딩 언어 (GLSL), 하이 레벨 쉐이딩 언어 (HLSL), 그래픽 용 C (Cg) 쉐이딩 언어 등에 기입된 프로그램의 컴파일링된 버전일 수도 있다.
프로그램가능 쉐이더 유닛은, 일부 예들에서 병렬, 예를 들어 단일 명령 다중 데이터 (SIMD) 파이프라인으로 동작하도록 구성되는 복수의 프로세싱 유닛들을 포함할 수도 있다. 프로그램가능 쉐이더 유닛은 쉐이더 프로그램 명령들을 저장하는 프로그램 메모리 및 실행 상태 레지스터, 예를 들어 실행되고 있는 프로그램 메모리에서의 현재 명령 또는 페치될 다음의 명령을 나타내는 프로그램 카운터 레지스터를 가질 수도 있다. 프로세싱 유닛들 (34) 에서의 프로그램가능 쉐이더 유닛들은, 예를 들어 정점 쉐이더 유닛들, 픽셀 쉐이더 유닛들, 지오메트리 쉐이더 유닛들, 헐 쉐이더 (hull shader) 유닛들, 도메인 쉐이더 유닛들, 컴퓨트 쉐이더 유닛들, 및/또는 통일된 쉐이더 유닛들을 포함할 수도 있다.
고정된-기능 프로세싱 유닛은 소정의 기능들을 수행하기 위해 하드-와이어링되는 하드웨어를 포함할 수도 있다. 고정-기능 하드웨어는 하나 이상의 제어 신호들을 통해, 예를 들어 상이한 기능들을 수행하도록 구성가능할 수도 있지만, 고정-기능 하드웨어는 통상적으로 사용자-컴파일링된 프로그램들을 수신할 수 있는 프로그램 메모리를 포함하지 않는다. 일부 예들에서, 프로세싱 유닛들 (34) 에서의 고정-기능 프로세싱 유닛들은, 예를 들어 심도 테스팅, 시저 (scissor) 테스팅, 알파 블렌딩 등과 같은 래스터 동작들을 수행하는 프로세싱 유닛들을 포함할 수도 있다.
타일-기반 렌더링 버퍼 (36) 는 렌더 타겟의 서브-영역 (예를 들어, 타일 또는 빈) 에 대한 래스터화된 데이터를 저장하도록 구성될 수도 있다. 타일-기반 렌더링 버퍼 (36) 는 렌더링 과정의 수행 동안 실제 렌더 타겟의 특정 서브-영역들에 대한 임시 렌더 타겟으로서 작용할 수도 있다. 타일-기반 렌더링 버퍼 (36) 는 하나 이상의 휘발성 또는 비-휘발성 메모리들 또는 저장 디바이스들, 예컨대 랜덤 액세스 메모리 (RAM), 정적 RAM (SRAM), 동적 RAM (DRAM) 등을 포함할 수도 있다. 일부 예들에서, 타일-기반 렌더링 버퍼 (36) 는 온-칩 버퍼일 수도 있다. 온-칩 버퍼는 GPU (12) 가 형성, 위치, 및/또는 배치되는 마이크로칩, 집적 회로, 및/또는 다이와 동일한 마이크로칩, 집적 회로, 및/또는 다이 상에 형성되고, 위치되며/되거나 배치되는 버퍼를 지칭할 수도 있다.
일부 예들에서, 프로세싱 유닛들 (34) 은 제 1 통신 인터페이스를 통해 타일-기반 렌더링 버퍼 (36) 에 액세스하고, 제 1 통신 인터페이스와 상이한 제 2 통신 인터페이스를 통해 렌더 타겟 (예를 들어, 메모리 (10) 에 저장된 프레임 버퍼) 에 액세스할 수도 있다. 이러한 예들에서, 제 1 통신 인터페이스는 일부 예들에서, 제 2 통신 인터페이스보다 더 높은 대역폭을 가질 수도 있다. 제 2 통신 인터페이스는 일부 예들에서, 도 1 에서의 버스 (18), 및 도 1 에서의 메모리 제어기 (8) 와 메모리 (10) 간의 접속에 대응할 수도 있다. 타일-기반 렌더링 버퍼가 온-칩 타일-기반 렌더링 버퍼인 경우, 제 1 통신 인터페이스는 GPU (12) 내부에 있는 통신 인터페이스일 수도 있다.
본원에 사용된 바와 같이, 대역폭은, 통신 인터페이스가 2 개의 컴포넌트들, 예를 들어 메모리 컴포넌트와 GPU (12) 간에 데이터를 전송할 수 있는 레이트를 지칭할 수도 있다. 대역폭에 대한 유닛들은, 일부 예들에서 시간 단위 당 비트들의 수, 예를 들어 초당 기가비트들 (Gb/s) 로서 주어질 수도 있다. 다수의 비트들의 버스 대역폭을 갖는 버스가 통신 인터페이스의 부분으로서 사용되는 경우, 이 대역폭은 일부 예들에서, 데이터가 단일의 비트 라인을 따라 전송되는 레이트만큼 곱해진 버스의 폭의 곱에 동일할 수도 있다. 예를 들어, 버스가 16 비트 와이드이고, 버스의 각각의 비트 라인이 2 Gb/s 의 레이트로 데이터를 전송할 수 있으면, 이 버스의 대역폭은 32 Gb/s 와 동일할 수도 있다. 다수의 버스들이 2 개의 컴포넌트들 간의 통신 인터페이스를 형성하면, 통신 인터페이스의 대역폭은 다수의 버스들 각각의 대역폭, 예를 들어 개별의 버스들 각각의 최소 대역폭의 함수일 수도 있다.
타일-기반 렌더링 버퍼 (36) 가 GPU (12) 와 동일한 칩 상에서 구현되는 경우, GPU (12) 는 반드시 시스템 및 메모리 버스들 (예를 들어, 도 1 에서의 버스 (18) 및 도 1 에서의 메모리 제어기 (8) 와 메모리 (10) 간의 접속) 을 통해 타일-기반 렌더링 버퍼 (36) 에 액세스할 필요가 없고, 차라리 GPU (12) 와 동일한 칩 상에 구현된 내부 통신 인터페이스 (예를 들어, 버스) 를 통해 타일-기반 렌더링 버퍼 (36) 에 액세스할 수도 있다. 이러한 인터페이스가 온-칩이기 때문에, 그것은 시스템 및 메모리 버스들보다 더 높은 대역폭에서 동작할 수 있다. 전술된 기법은 메모리 (10) 에 액세스하는데 사용된 통신 인터페이스의 대역폭을 초과하는 타일-기반 렌더링 버퍼 (36) 에 대한 통신 인터페이스를 달성하는 하나의 방법이지만, 다른 기법들이 본 개시물의 범위 내에 있고 가능하다.
타일-기반 렌더링 버퍼 (36) 의 용량은, 일부 예들에서 소정 타입들의 컴퓨팅 디바이스들, 예를 들어 모바일 디바이스들 상에서 이용 가능한 메모리에 의해 제한될 수도 있다. 렌더링 버퍼 (36) 는 빠른 그래픽 메모리일 수도 있다. 더욱이, 타일-기반 렌더링 버퍼 (36) 가 GPU (12) 와 동일한 칩 상에서 구현되는 경우, 동일한 칩 상에서 타일-기반 렌더링 버퍼 (36) 를 구현하는데 이용 가능한 영역의 양은 그 칩 상에 구현되는 다른 기능으로 인해 제한될 수도 있다. 일부 예들에서, 타일-기반 렌더링 버퍼 (36) 는 타일-기반 렌더링 버퍼 (36) 의 용량을 추가로 제한하는 렌더 타겟의 비트 밀도보다 낮은 비트 밀도를 가질 수도 있다. 이들 및/또는 다른 팩터들 때문에, 타일-기반 렌더링 버퍼 (36) 의 용량은 일부 경우들에서, 렌더 타겟의 사이즈보다 작을 수도 있다. 결과적으로, 타일-기반 렌더링 버퍼 (36) 의 용량은, 이러한 예들에서 그래픽 이미지와 연관된 복수의 목적지 픽셀들 모두에 대한 픽셀 데이터를 저장할 필요가 있는 최소 용량보다 적을 수도 있다. 메모리 컴포넌트의 용량은 메모리 컴포넌트에 저장될 수 있는 데이터의 최대 양 (예를 들어, 비트들의 최대 수) 을 지칭할 수도 있다. 렌더 타겟의 사이즈는 그 렌더 타겟에 할당된 메모리 범위에서 저장된 데이터의 양 (예를 들어, 비트들의 수) 를 지칭할 수도 있다. 비트 밀도는 특정 양의 면적에 저장될 수 있는 비트들의 수를 지칭할 수도 있다.
전술된 바와 같이, 타일-기반 렌더링을 수행하는 경우, GPU (12) 는 렌더링 과정의 별개의 반복 동안 렌더 타겟의 각각의 서브-영역을 렌더링할 수도 있다. 예를 들어, 렌더 타겟의 특정 서브-영역 (예를 들어, 그래픽 이미지의 목적지 픽셀들의 특정 서브세트) 에 대한 단일의 렌더링 과정 반복의 부분으로서, GPU (12) 는 렌더 타겟의 특정 서브-영역에 대하여 프리미티브들의 서브세트 또는 전부를 렌더링할 수도 있다. 전술된 바와 같이, 렌더링 버퍼 (36) 는 빠른 그래픽 메모리일 수도 있다. 타일-기반 렌더링 버퍼 (36) 의 용량은 렌더 타겟의 서브-영역의 사이즈보다 크거나 이와 동일하도록 구성될 수도 있다. 따라서, 렌더링 타겟은 빠른 그래픽 메모리의 사이즈 (또는 이보다 작은 사이즈) 일 수도 있다. 따라서, 단일의 렌더링 과정 반복 동안, 렌더 타겟의 서브-영역들의 개별의 영역과 연관된 모든 목적지 픽셀 데이터는 메모리 (10) 에서의 프레임 버퍼에 반드시 액세스할 필요 없이, 타일-기반 렌더링 버퍼 (36) 에서 이용 가능할 수도 있다. 결과적으로, 단일의 렌더링 과정 반복 동안, GPU (12) 는 상대적으로 낮은 대역폭 통신 인터페이스를 통해 메모리 (10) 로부터 이러한 데이터를 판독하기 보다는 상대적으로 높은 대역폭 통신 인터페이스를 통해 타일-기반 렌더링 버퍼 (36) 로부터 목적지 픽셀 데이터를 판독할 수도 있다.
타일-기반 렌더링을 수행하지 않는 일부 그래픽 시스템들은 하드웨어-기반의 온-칩 캐시를 사용함으로써 프레임 버퍼의 부분을 캐싱할 수도 있지만, 이러한 캐시들은 소정 픽셀에 대한 목적지 픽셀 값들이 필요한 경우 이용가능할 것이라는 것을 보장하지 않는다. 이것은, 다수의 목적지 픽셀들이 하드웨어-기반 캐시에서 동일한 어드레스로 맵핑할 수도 있기 때문이다. 이 경우에서 타일-기반 렌더링이 사용되지 않으면, 하드웨어-기반 캐시의 현재 상태는 반드시 현재 프로세싱된 프리미티브와 연관된 목적지 픽셀 값들을 포함하지 않고, 차라리 그래픽 이미지의 다른 면적들에서 이전에 프로세싱된 프리미티브들과 연관된 목적지 픽셀 값들을 포함할 수도 있다.
다수의 목적지 픽셀들이 동일한 캐시 로케이션으로 맵핑되는 하드웨어-기반 캐시에 대조적으로, 소정의 렌더링 과정 반복 동안 타일-기반 렌더링 버퍼 (36) 에 저장된 목적지 픽셀들은 일부 예들에서 고유하게 어드레스가능할 수도 있다. 다시 말하면, 소정의 렌더링 과정 반복 동안, 일-대-일 맵핑은 타일-기반 렌더링 버퍼 (36) 에서의 어드레스가능 저장 슬롯들과 그 렌더링 과정 반복 동안 사용된 목적지 픽셀들 간에 정의될 수도 있다. 결과적으로, 타일-기반 렌더링을 수행하는 경우, 소정의 타일-기반 렌더링 과정 동안 모든 목적지 알파 값들은, 일부 예들에서 상대적으로 낮은 대역폭 통신 인터페이스를 통해 타일-기반 렌더링 버퍼 (36) 로부터 이용 가능해질 수도 있다. 더욱이, 하드웨어-기반 캐시 시스템들과는 달리, 타일-기반 렌더링 버퍼 (36) 에서 고유하게 어드레스가능한 데이터 때문에, 캐시 미스들이 발생하지 않고 이로써 캐시 미스의 경우에서 대역폭-비싼 프레임 버퍼 액세스들에 재분류 (resort) 할 필요를 완화시킨다.
목적지 픽셀은 특정 픽셀 로케이션에 대한 렌더 타겟 (예를 들어, 프레임 버퍼나 대응하는 타일-기반 렌더링 버퍼 중 어느 하나) 에 저장된 픽셀 데이터를 지칭할 수도 있다. 반대로, 소스 픽셀은 프로세싱 유닛들 (34) 에서 래스터화 프로세싱 유닛에 의해 생성되고 렌더 타겟에 아직 저장되지 않고/않거나 이와 병합되지 않은 픽셀 데이터를 지칭할 수도 있다. 목적지 픽셀은 상이한 프리미티브들과 연관된 다수의 소스 픽셀들로부터 합성된 픽셀 데이터를 포함할 수도 있다.
타일-기반 렌더링을 수행하기 위해, 소프트웨어 애플리케이션 (24) 은 일부 예들에서, 프리미티브 데이터 (40) 를 렌더링될 하나 이상의 3D 그래픽 프리미티브들의 세트를 기하학적으로 정의하는 메모리 (10) 에 배치하고, 하나 이상의 드로우 콜 커맨드들을 그래픽 API (26) 를 통해 GPU 드라이버 (28) 에 발행할 수도 있다. 드로우 콜 커맨드들은 프리미티브 데이터 (40) 에 의해 정의된 프리미티브들로 하여금 래스터화되어 GPU (12) 에 의해 렌더 타겟 (예를 들어, 메모리 (10) 에 저장된 프레임 버퍼) 로 렌더링되게 할 수도 있다.
일부 예들에서, 드로우 콜 커맨드들을 발행하기 전에, 소프트웨어 애플리케이션 (24) 은 특정 타입의 프리미티브들을 렌더링하도록 GPU (12) 를 구성할 수도 있다. 예를 들어, 소프트웨어 애플리케이션 (24) 은 드로우 콜 동안 렌더링할 특정 타입의 프리미티브를 지정하는 GPU (12) 로 상태 커맨드를 발행할 수도 있다. 추가의 예들에서, 드로우 콜 커맨드들을 발행하기 전에, 소프트웨어 애플리케이션 (24) 은 프리미티브를 렌더링하기 위한 하나 이상의 테셀레이션 기법들을 사용하도록 GPU (12) 를 구성할 수도 있다. 예를 들어, 소프트웨어 애플리케이션 (24) 은 테셀레이션 기법들을 구현하는 하나 이상의 쉐이더 프로그램들로 하여금, 드로우 콜 명령 동안 GPU (12) 의 하나 이상의 쉐이더 유닛들 (예를 들어, 헐 쉐이더 유닛 및/또는 도메인 쉐이더 유닛) 을 실행하게 할 수도 있다.
프리미티브 데이터 (40) 는 렌더링될 하나 이상의 프리미티브들을 나타내는 데이터를 포함할 수도 있다. 일부 경우들에서, 프리미티브 데이터 (40) 는 렌더링될 프리미티브들을 기하학적으로 정의할 수도 있다. 프리미티브를 기하학적으로 정의하는 것은 정점들 (또는 제어 포인트들) 의 세트 및 대응하는 정점 속성들에 의해 프리미티브를 정의하는 것을 지칭할 수도 있다. 일부 예들에서, 프리미티브 데이터 (40) 는 복수의 정점들, 정점 리스트, 및/또는 정점 버퍼의 형태를 취할 수도 있다. 추가의 예들에서, 프리미티브 데이터 (40) 는 인덱스 버퍼와 결합하여 정점 버퍼의 형태를 취할 수도 있다. 이러한 예들에서, 정점 버퍼는 정점들을 정의할 수도 있고, 인덱스 버퍼는 프리미티브들 각각을 정의하는데 어느 정점들이 사용되는지를 지정할 수도 있다.
프리미티브 데이터 (40) 에 포함된 정점들 각각은 하나 이상의 속성들, 예컨대 위치적 좌표들, 통상의 좌표들, 텍스처 좌표들 등을 포함할 수도 있다. 정점들은 기하학적 프리미티브 (예를 들어, 포인트, 라인, 삼각형 등) 의 정점들 및/또는 고차 (higher-order) 프리미티브 (예를 들어, 고차 표면, 예컨대 베지어 곡면 (Bezier surface)) 의 제어 포인트들에 개념적으로 대응할 수도 있다. 일부 경우들에서, 정점들 각각은 하나 이상의 정점들의 그룹들로 그룹화될 수도 있고, 정점들의 이들 그룹들 각각은 단일의 프리미티브에 대응할 수도 있다.
기하학적으로 정의된 프리미티브의 형상은, 일부 예들에서 프리미티브 데이터 (40) 에 반드시 포함되지 않은 추가의 데이터에 의해 정의될 수도 있다. 추가적인 데이터는 하나 이상의 미리 결정된 프리미티브 타입들, 하나 이상의 수학 함수들, 및/또는 하나 이상의 테셀레이션 기법들의 세트로부터 지정된 프리미티브 타입 중 하나 이상을 포함할 수도 있다.
일부 예들에서, 지정된 프리미티브 타입은 GPU (12) 에서 렌더링 상태 변수로서 저장될 수도 있고, 소프트웨어 애플리케이션 (24) 에 의해 구성 가능할 수도 있다. 지정된 프리미티브 타입은, 일부 경우들에서 프리미티브 데이터 (40)(예를 들어, 삼각형 스트라이프, 삼각형 팬 등) 에 포함된 정점들의 접속성 및/또는 결과의 렌더링된 프리미티브들 (예를 들어, 포인트들, 라인들, 삼각형들 등) 의 형상을 정의할 수도 있다. 일부 예들에서, 상이한 프리미티브 타입들은 프로세싱 유닛들 (34) 에 의해 구현된 그래픽 파이프라인이 프로세싱할 수 있는 프리미티브 토폴로지들의 세트에 대응할 수도 있다. 추가의 예들에서, 상이한 프리미티브 타입들은 소프트웨어 애플리케이션 (24) 에 의한 사용을 위해 이용 가능하고 그래픽 API (26) 에 의해 정의되는 프리미티브 토폴로지들의 세트에 대응할 수도 있다.
하나 이상의 수학 함수들 및/또는 하나 이상의 테셀레이션 기법들은 GPU (12) 의 하나 이상의 쉐이더 유닛들 (예를 들어, 헐 쉐이더 유닛 및/또는 도메인 쉐이더 유닛) 상에서 실행하도록 구성되는 하나 이상의 쉐이더 프로그램들에서 지정될 수도 있다. 수학 함수들은 곡선들 및/또는 곡면들을 갖는 프리미티브들을 정의하는데 사용될 수도 있다. 하나 이상의 테셀레이션 기법들은 입력 프리미티브의 형상 및/또는 곡률에 근사하는 복수의 테셀레이션 프리미티브들에 의해 프리미티브를 정의하는데 사용될 수도 있다.
소프트웨어 애플리케이션 (24) 으로부터 드로우 콜 커맨드를 수신하는 것에 응답하여, GPU 드라이버 (28) 는 GPU (12) 로 하여금 렌더링될 복수의 프리미티브들 (예를 들어, 프리미티브 데이터 (40)) 에 기초하여 타일-기반 렌더링을 수행하게 할 수도 있다. 예를 들어, GPU 드라이버 (28) 는 GPU (12) 로 하여금 복수의 렌더링 과정 반복들을 포함하는 렌더링 과정 및 비닝 과정을 수행하게 할 수도 있다. 비닝 과정 동안, GPU (12) 는 복수의 서브-영역들, 예를 들어 프리미티브들의 렌더 타겟 각각의 빈들 또는 타일들 중 어느 것이 이미지 데이터 (예를 들어, 픽셀 데이터) 에 기여하는지를 결정하고, 프리미티브들의 렌더 타겟 각각의 복수의 서브-영역들 중 어느 것이 이미지 데이터 (예를 들어, 픽셀 데이터) 에 기여하는지를 나타내는 비닝 데이터 (예를 들어, 빈들 또는 타일들로부터의 데이터) 를 생성할 수도 있다. 일단 비닝 데이터가 생성되었으면, GPU (12) 는 비닝 데이터 및 프리미티브 데이터 (40) 에 기초하여 복수의 렌더링 과정 반복들을 포함하는 렌더링 과정을 수행하여, 프리미티브들의 합성의, 래스터화된 버전을 생성할 수도 있다.
일부 예들에서, 비닝 과정을 수행하기 위해, GPU (12) 에서의 래스터라이저는 래스터화될 프리미티브들에 대한 저-해상도 z-버퍼링 및/또는 백-페이스 컬링을 수행하도록 구성될 수도 있다. 이러한 예들에서, 비닝 데이터는 z-버퍼링 및/또는 백-페이스 컬링 후에 가시적인 프리미티브들에 기초하여 생성될 수도 있다.
일부 경우들에서, 렌더링된 프리미티브들은 복수의 픽셀들로서 저장될 수도 있다. 픽셀들 각각은 렌더 타겟의 하나 이상의 공간적 로케이션들과 연관될 수도 있고, 개별의 픽셀의 컬러를 나타내는 하나 이상의 속성들을 포함할 수도 있다. 일부 경우들에서, 픽셀들 각각은 픽셀의 투명도를 나타내는 하나 이상의 속성들을 더 포함할 수도 있다. 일부 예들에서, 픽셀 데이터는 각각의 픽셀에 대해 레드, 그린, 블루, 및 알파 (RGBA) 속성들을 포함할 수도 있고, 여기서 "RGB" 컴포넌트들은 컬러 값들에 대응하고 "A" 컴포넌트는 알파 값에 대응한다.
본 개시물에 설명된 기법들은, 예를 들어 소프트웨어 애플리케이션 (24), 그래픽 API (26), GPU 드라이버 (28), 커맨드 엔진 (32) 및 프로세싱 유닛들 (34) 을 포함하는 도 2 에 도시된 컴포넌트들 중 어느 하나에서 구현될 수도 있다. 예를 들어, GPU 드라이버 (28), 커맨드 엔진 (32), 및/또는 프로세싱 유닛들 (34) 이 구성될 수도 있다.
다른 예들에서, CPU (6) 보다는 GPU (12) 가 시작 값을 결정하기 위해 쿼리의 시작에서 이산 그래픽 엔티티들을 카운트할 수도 있는 러닝 카운터를 판독하게 하도록 소프트웨어를 실행할 수도 있다. GPU (12) 는 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하고, 종료 값으로부터 시작 값을 감산하여 결과를 결정할 수도 있다.
일부 예들에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 제 2 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 3 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다.
다른 예에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 제 2 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 1 또는 제 2 메모리 로케이션 중 하나를 중복기재 (overwrite) 할 수도 있다.
일부 예들은 제 2 쿼리를 네스팅하는 것을 더 포함할 수도 있다. 네스팅은 제 2 쿼리의 시작에서 러닝 카운터를 판독하여 제 2 시작 값을 결정하고, 제 2 쿼리의 종료에서 러닝 카운터를 판독하여 제 2 종료 값을 결정하며, 제 2 시작 값을 제 2 종료 값으로부터 감산하여 결과를 결정함으로써 행해질 수도 있다.
도 3 은 타일-기반 렌더링을 예시하는 개념도이다. 전술된 바와 같이, 비닝 또는 타일-기반 렌더링은 "타일들" 또는 "빈들" 로 지칭된 더 작은 부분들에서 3D 장면을 렌더링하기 위한 방식을 제공할 수도 있다. 전술된 바와 같이, 타일 기반 렌더링은 장면에서 로컬 공간적 코히런스를 활용하는데 사용되어, 그래픽 파이프라인에서 나중에 리소스들을 렌더링하는 제한된 하드웨어의 사용 또는 양자 모두를 용이하게 할 수도 있다. 일반적으로, 타일 기반 렌더링에서, 시스템, 장치, 또는 디바이스, 예컨대 컴퓨터 그래픽 디바이스는 프레임을, 예를 들어 규칙적인 그리드로 분할할 수도 있다. 이 그리드는, 프레임 또는 다른 영역의 일부들인 타일들을 형성한다. 일 예에서, 각각의 타일 또는 빈은 동일한 렌더링 커맨드 스트림을 사용하여 렌더링될 수도 있다.
도 3 의 타일-기반 렌더링 예에서, 폴리곤들, 예를 들어 삼각형들, Tri A, Tri B 및 Tri C 을 드로잉 위한 렌더링 커맨드들은 네 번, 예를 들어 모든 타일에 대해 한 번 실행될 수도 있다. 하드웨어 카운터, 예컨대 차폐 쿼리 카운터를 사용하는 예에서, 차폐 쿼리 카운터들을 리셋, 시작 및 정지하기 위한 하드웨어 커맨드들은 단지 네스팅이 사용되지 않는 경우에만 각각의 타일에 대해 실행될 수도 있다. 일부 예들에서, 소프트웨어 카운터가 사용되면, 소프트웨어 커맨드들은 이들 동작들을 수행할 수도 있다. 일부 예들에서, 본 개시물의 기법들에 따르면, 예를 들어 모든 타일에서의 카운터의 하드웨어 리셋이, 이것이 하나 이상의 다른 쿼리들을 카운트하는 중간에 카운터를 리셋함으로써 네스팅된 쿼리 또는 쿼리들에 영향을 줄 수도 있기 때문에 허용될 수 없도록 네스팅된 차폐 쿼리들이 허용될 수도 있다. 예를 들어, 제 1 쿼리가 시작되고, 그 쿼리에 대해 사용된 카운터가 쿼리의 시작에서 리셋된다고 가정한다. 또한, 제 2 쿼리가, 제 1 쿼리의 종료 전에 시작된다고 가정한다. 제 2 쿼리는, 제 1 쿼리가 여전히 수행되고 있는 동안 시작되기 때문에 네스팅된 쿼리라고 한다. 단일의 카운터가 양자 모두의 쿼리들에 대해 사용되고 제 2 쿼리의 시작에서 카운터가 리셋되면, 제 1 쿼리의 종료에서 카운터로부터 판독된 값은 부정확할 것으로 예상된다. 예를 들어, 판독된 값은 통상적으로 너무 작을 수도 있다.
일부 예들에서, 이들 기법들을 구현하는 시스템들, 방법들, 및 디바이스들은 각각의 타일에 대한 시작 및 종료 카운터 값을 저장할 필요가 있을 수도 있다. 이들 값들은 메모리, 레지스터들, 또는 일부 다른 스토리지에 저장될 수도 있다. 예를 들어, 시작 값은 메모리 (10), 레지스터, 또는 일부 다른 메모리 또는 스토리지 로케이션에 저장될 수도 있다. 종료 값은 또한, 메모리 (10), 레지스터, 또는 일부 다른 메모리 또는 스토리지 로케이션에 저장될 수도 있다. 다른 예에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 제 2 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 3 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 다른 예에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 제 2 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 1 또는 제 2 메모리 로케이션들 중 하나를 중복기재할 수도 있다. 또 다른 예에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 레지스터에 저장될 수도 있다. 결과는 제 1 메모리 로케이션에 저장될 수도 있다.
타일-기반 렌더링은, 일부 예들에서 렌더 타겟을 복수의 서브-영역들 (예를 들어, 빈들 또는 타일들) 로 세분하는 것, 및 렌더 타겟의 서브-영역들 각각에 대한 별개의 렌더링 과정 반복을 포함하는 렌더링 과정을 수행하는 것을 수반할 수도 있다. 렌더링 과정 동안 프로세싱될 필요가 있는 프리미티브들의 수를 감소시키기 위해, 비닝 과정은 일부 예들에서, 렌더링 과정 전에 수행될 수도 있다. 비닝 과정은 렌더링될 프리미티브들의 렌더 타겟 각각의 복수의 서브-영역들 중 어느 것이 픽셀 데이터에 기여하는지를 나타내는 비닝 데이터를 생성하는데 사용될 수도 있다. 비닝 데이터는, 특정 렌더링 과정 반복들 동안 활성적인 서브-영역들에 기여하는 프리미티브들을 선택적으로 렌더링하기 위해 렌더링 과정 반복들 동안 사용될 수도 있고, 이에 의해 렌더링 과정 동안 프로세싱될 필요가 있는 프리미티브들의 수를 감소시킨다.
렌더링은 그래픽 장면에서 3D 오브젝트들에 대응하는 3D 그래픽 프리미티브들을 2D 래스터화된 이미지 데이터로 변환하는 프로세스를 지칭할 수도 있다. 렌더링은 통상적으로, 장면에서의 그래픽 프리미티브들 각각이 렌더링될 때 대개 업데이트되는, 렌더 타겟 (예를 들어, 프레임 버퍼) 에 대하여 발생한다. 따라서, 렌더 타겟은 그래픽 장면에 대해 최종의 2D 래스터화된 이미지 데이터를 저장할 뿐만 아니라, 렌더 타겟은 그래픽 장면이 렌더링될 때 중간 데이터를 저장할 수도 있다. 렌더 타겟에 저장된 2D 래스터화된 이미지 데이터는 복수의 픽셀들을 포함할 수도 있고, 여기서 픽셀들 각각은 컬러 데이터, 투명도 데이터, 및/또는 심도 데이터를 포함한다. 각각의 새로운 프리미티브가 렌더 타겟으로 렌더링될 때, 새로운 프리미티브의 2D 래스터화된 이미지 데이터는 이전에 렌더링된 프리미티브들에 대한 렌더 타겟에 이미 저장되는 기존의 중간 데이터와 병합된다.
렌더 타겟에서 데이터를 병합하기 위해, 중간 데이터는 통상적으로, 새로운 데이터를 렌더 타겟에 기입하기 전에 렌더 타겟으로부터 판독될 필요가 있다. 따라서, 렌더링은 렌더 타겟을 포함하는 메모리에 대하여 다수의 판독 및 기입 동작들의 수행을 수반할 수도 있고, 이에 의해 고 메모리 대역폭 사용을 초래한다. 고 메모리 대역폭 사용 때문에, 렌더 타겟에 대해 전용된, 고-대역폭 온-칩 메모리를 사용하는 것이 바람직하다. 그러나, 면적-제한된 애플리케이션들, 예컨대 모바일 애플리케이션들에서, 렌더 타겟에서 픽셀들 각각에 대한 데이터의 전부를 동시에 홀딩할 수 있는 고 대역폭, 온-칩 메모리를 구현하기에 충분히 이용 가능한 면적이 없을 수도 있다.
타일-기반 렌더링은 렌더 타겟을 복수의 서브-영역들 (예를 들어, 타일들 또는 빈들) 로 세분하고, 서브-영역들 각각에 대한 별개의 렌더링 과정 반복들을 포함하는 렌더링 과정을 수행함으로써 전술된 이슈들을 어드레싱할 수도 있다. 서브-영역들 각각은 렌더 타겟에서 픽셀들의 서브 세트 (예를 들어, 픽셀들의 16x16 타일) 에 대응할 수도 있다. 렌더링 과정 반복들 각각 동안, 대응하는 서브-영역과 연관된 이미지 데이터의 전부가 렌더링될 수도 있고, 이것은 픽셀 데이터에 기여하는 프리미티브들 각각을 서브-영역에 렌더링하는 것을 포함할 수도 있다. 렌더 타겟의 단일의 서브-영역에 대한 데이터를 저장하기에 충분히 큰 고-대역폭, 온-칩 메모리가 렌더링 과정 반복들 각각 동안 로컬 렌더 타겟으로서 사용될 수도 있고, 렌더링 과정 반복이 완료된 후에 렌더링 과정 반복 동안 로컬 렌더 타겟의 콘텐츠는 저-대역폭, 오프-칩 시스템 메모리에 저장된 일반적인 렌더 타겟으로 전송될 수도 있다. 타일-당 단위에 대해 별개의 렌더링 과정 반복들을 수행함으로써, 대형 온-칩 메모리들에 대해 허용되지 않는 면적-제한된 애플리케이션들에서도, 타일-기반 렌더링 스킴들은 고-대역폭, 온-칩 메모리가 래스터화된 이미지 데이터를 병합하는데 사용되는 것을 허용할 수도 있다.
타일-기반 렌더링을 수행하기 위한 하나의 접근은 렌더러 타겟의 서브-영역들 각각에 대한 렌더링 과정 반복을 수행하고, 현재 렌더링되고 있는 특정 서브-영역에 대한 출력을 제한하도록 상이한 시저 세팅들을 사용하면서 렌더링 과정 반복들 각각 동안 장면에서의 프리미티브들 전부를 렌더링하는 것이다. 그러나, 이러한 접근은 프리미티브가 렌더링된 서브-영역에서 실제로 가시적인지 아닌지 여부에 관계 없이, 렌더링 과정 반복들 각각에서 그 프리미티브들 각각이 렌더링되기 때문에 비효율적일 수도 있다.
타일-기반 렌더링의 효율성을 개선시키기 위해, 비닝 과정은 일부 예들에서, 렌더링 과정의 수행 전에 수행될 수도 있다. 비닝 과정은 프리미티브들에 대한 비닝 데이터를 결정하는데 사용될 수도 있다. 렌더링될 프리미티브들 각각에 대해, 비닝 데이터는 프리미티브들의 렌더 타겟 각각의 서브-영역들 중 어느 것이 픽셀 데이터에 기여하는지에 대하여 나타낼 수도 있다.
도 4 는 예시의 차폐 쿼리 (400) 를 예시하는 개념도이다. 도 4 에 예시된 예에서, 쿼리 결과는 GPU (12) 에 의해 타일 마다 출력되고 나중에 CPU (6) 에 의해 누산될 수도 있다. 이 중간의 타일-당 결과를 저장하는데 필요한 메모리의 양은 타일들의 수에서의 증가와 선형적으로 증가하고, 그것은 또한 누산을 행하기 위해 CPU (6) 에 의해 취해진 시간의 양을 증가시킨다. 도 4 는 4 개의 빈들 또는 타일들 (402, 404, 406, 408) 을 예시한다. 도 4 에 예시된 바와 같이, 쿼리 결과 A 에 대한 메모리 로케이션 (410) 및 쿼리 결과 BC 에 대한 메모리 로케이션 (412) 이 리셋될 수도 있다, 즉 카운터 값들이 클리어될 수도 있다 (414). 카운터는 쿼리 A 에 대해 시작되고 (416), 그 후 쿼리 A 가 완료될 때 정지될 수도 있다 (418). 카운터로부터의 결과들은 쿼리 A 에 대한 메모리 로케이션 (410) 에 기입될 수도 있다. 유사하게, 카운터 (일부 예들에서 동일한 카운터) 는 쿼리BC 에 대해 시작되고 (422), 그 후 쿼리BC 가 완료될 때 정지될 수도 있다 (424). 카운터로부터의 결과들은 쿼리BC 에 대한 메모리 로케이션 (412) 에 기입될 수도 있다. 이러한 예에서, 차폐 쿼리와 같은 쿼리에서 중간의 타일-당 결과들을 저장하는데 필요한 메모리의 양은 타일들의 수에서의 증가와 선형적으로 증가할 수도 있다. 타일들의 수에서의 증가는 또한, 누산을 행하기 위해 CPU 에 의해 취해진 시간 양을 증가시킨다. 일부 예들에서, 이러한 쿼리들을 수행하기 위한 더 메모리 및 시간 효율적인 방식은 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정할 수도 있고, 여기서 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하고, 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하며, 종료 값으로부터 시작 값을 감산하여 결과를 결정한다.
도 5 및 도 6 은 예를 들어 쿼리들 ABC 및 BC 에 대한 메모리 맵들 (500, 600) 을 예시한다. 도 5 는 예시의 메모리 맵 (500) 을 예시하는 개념도이다. 도 5 에 예시된 예에서, 쿼리 결과는 GPU (12) 에 의해 타일 마다 출력되고 나중에 CPU (6) 에 의해 누산될 수도 있다. 도 5 에 예시된 바와 같이, 메모리 맵 (500) 은 각각의 타일 (402, 404, 406, 408) 에 대한 다수의 메모리 로케이션들 및 각각의 쿼리, 예를 들어 쿼리ABC 및 쿼리BC 를 포함할 수도 있다. 예를 들어, 도 5 의 예시된 예에서, 쿼리ABC 는 각각의 타일에 대한 시작 및 종료 값들을 포함하고, 쿼리BC 는 각각의 타일에 대한 시작 및 종료 값들을 포함한다. 따라서, 각각의 쿼리에 대한 메모리 맵에서 메모리의 양은 타일들의 수에서의 증가와 선형적으로 증가하고, 또한 최종 결과가 애플리케이션에 의해 요청될 때 누산을 행하도록 CPU (6) 에 의해 취해진 시간의 양을 증가시킨다. 예를 들어, 각각의 쿼리에 대해, CPU (6) 는 대응하는 빈/타일 정지 값으로부터 각각의 빈/타일 시작 값을 감산하고, 이들 결과들 각각에 대한 누산을 수행할 필요가 있을 수도 있다.
쿼리의 시작에서, 쿼리ABC 에 대한 3 개의 메모리 로케이션들 및 쿼리BC 에 대한 3 개의 메모리 로케이션들은 0 으로 리셋될 수도 있다. 쿼리ABC 에 대한 쿼리 카운터 시작 값 (값 SABC) 은 쿼리ABC 메모리의 쿼리 카운터 시작 값 부분에 기입될 수도 있다. 일부 예들에서, 이것은 하드웨어 커맨드들에 의한 것일 수도 있다.
쿼리BC 는 일 예에서, 네스팅된 쿼리일 수도 있다. 쿼리BC 에 대한 쿼리 카운터 시작 값 (값 SBC) 은 쿼리BC 메모리의 쿼리 카운터 시작 값에 기입될 수도 있다. 쿼리ABC 에 대한 쿼리 종료 값 (값 EABC) 은 쿼리ABC 메모리의 쿼리 카운터 종료 값에 기입될 수도 있다. 누산이 수행될 수도 있고, 이 결과는 쿼리ABC 메모리의 누산된 최종 결과 메모리에 기입될 수도 있다. 유사하게, 하드웨어 커맨드들은 쿼리BC 에 대한 쿼리 카운터 종료 값 (값 EBC) 을 쿼리BC 메모리의 쿼리 카운터 종료 값 메모리 로케이션에 기입할 수도 있다. 누산이 수행될 수도 있고, 이 결과는 쿼리BC 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다.
도 6 은 본 개시물에 따른 예시의 메모리 맵 (600) 을 예시하는 개념도이다. 예시된 바와 같이, 단지 3 개의 메모리 로케이션들이 각각의 쿼리에 대해 사용된다. 각각의 쿼리에 대해, 시작 값이 저장될 수도 있다. 예를 들어, 특정 쿼리의 시작에서, 러닝 카운터의 값은 그 쿼리에 대한 대응하는 시작 메모리 로케이션에 기입될 수도 있다. 쿼리의 종료에서, 러닝 카운터 값은 그 쿼리에 대한 대응하는 종료 메모리 로케이션에 기입될 수도 있다. 차이가 또한 계산되고, 대응하는 메모리 로케이션에 기입되어 그 쿼리에 대한 최종 결과를 저장할 수도 있다. 다른 예들은 각각의 쿼리에 대해 단지 1 또는 2 개의 메모리 로케이션들을 사용할 수도 있다. 예를 들어, 최종 결과 값은 단지 2 개의 메모리 로케이션들을 사용할 수도 있는 시스템에 대해 제공하기 위해 대응하는 시작 및 정지 메모리 로케이션들 중 하나 또는 양자 모두에 대한 메모리 로케이션에 기입될 수도 있다. 대안으로, 예를 들어 메모리 로케이션과 러닝 카운터 간의 차이 및 러닝 카운터로부터의 판독이 단일 클록 사이클로 수행될 수 있으면, 단일의 메모리 로케이션이 각각의 쿼리에 대해 사용될 수 있도록 단일의 메모리 로케이션이 그 시작을 저장하고 그 후 차이 값으로 중복기재될 수도 있다. 다른 예들에서, 임시 메모리 로케이션들 또는 레지스터들이 예를 들어 종료 값들을 저장하기 위해 사용되어, 차이 값들을 결정하기 위한 수학 연산들이 각각의 정지 값에 대해 전용된 메모리 로케이션들을 사용하지 않고 수행될 수도 있다. 일 예에서, 차이는 또한, GPU (12) 에 의해 계산되고 대응하는 메모리 로케이션에서 누산될 수도 있다.
전술된 바와 같이, 본원에 설명된 시스템들 및 방법들은 다양한 쿼리들, 예컨대 차폐 쿼리, 타임스탬프 쿼리, 파이프라인 스테이터스 쿼리 (파이프라인 통계들) 등을 수행할 수도 있다. 예를 들어, 이들 시스템들 및 방법들은 2 개의 쿼리들, 쿼리ABC 및 쿼리BC 를 수행할 수도 있고, 하나의 쿼리는 다른 것과 네스팅된다. 3 개 이상의 네스팅된 쿼리들이 또한 가능한 것으로 이해될 것이다.
2 개의 쿼리들의 예에서, 하나가 다른 것과 네스팅되어 수행될 수도 있다. 그 예에서, 3 개의 메모리 로케이션들은 쿼리ABC 에 대해 0 으로 리셋될 수도 있다. 예를 들어, 도 6 에 예시된 바와 같이, 차폐 쿼리 카운터 시작 값, 차폐 쿼리 카운터 종료 값, 및 누산된 최종 결과에 대한 쿼리ABC 결과 메모리에서의 메모리 로케이션들은 쿼리ABC 에 대해 0 으로 리셋될 수도 있다. 3 개의 메모리 로케이션들이 또한, 쿼리BC 에 대해 0 으로 리셋될 수도 있다. 예를 들어, 도 6 에 예시된 바와 같이, 차폐 쿼리 카운터 시작 값, 차폐 쿼리 카운터 종료 값, 및 누산된 최종 결과에 대한 쿼리BC 결과 메모리에서의 메모리 로케이션들은 쿼리BC 에 대해 0 으로 리셋될 수도 있다. 삼각형들 ABC 에 대한 쿼리가 시작하는 경우, 쿼리ABC 에 대한 카운터 시작 값 (값 SABC) 은 쿼리ABC 의 쿼리 카운터 시작 값 부분에 기입될 수도 있다. 이것은 하드웨어 커맨드들을 사용하여 메모리에 기입하는 것에 의한 것일 수도 있다. 예를 들어, 도 6 에 예시된 바와 같이, 시작 값은 쿼리ABC 결과 메모리 로케이션들 차폐 쿼리 카운터 시작 값에 기입될 수도 있다.
쿼리BC 는 일 예에서, 네스팅된 쿼리일 수도 있다. 쿼리BC 에 대한 쿼리 카운터 시작 값 (값 SBC) 은 쿼리BC 메모리의 쿼리 카운터 시작 값, 즉 쿼리BC 결과 메모리의 쿼리 카운터 시작 값에 기입될 수도 있다. 일 예에서, 쿼리ABC 는 쿼리BC 전에 종료할 수도 있다. 따라서, 쿼리ABC 에 대한 쿼리 종료 값 (값 EABC) 은 쿼리ABC 결과 메모리의 차폐 쿼리 카운터 종료 값에 기입될 수도 있다. 누산이, 예를 들어 CPU (6) 또는 GPU (12) 와 같은 프로세서에 의해 수행될 수도 있고, 그 결과는 쿼리ABC 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다. 유사하게, 쿼리BC 가 완료되는 경우, 하드웨어 커맨드들은 쿼리BC 에 대한 쿼리 카운터 종료 값 (값 EBC) 을 쿼리BC 결과 메모리의 쿼리 카운터 종료 값 메모리 로케이션에 기입할 수도 있다. 누산이, 예를 들어 CPU (6) 또는 GPU (12) 와 같은 프로세서에 의해 수행될 수도 있고, 그 결과는 쿼리BC 결과 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다.
도 7 은 본 개시물의 기법들에 따라 예시의 차폐 쿼리를 예시하는 개념도이다. 도 7 의 예시된 예에서, 모든 "타일들" 을 드로우하기 위한 커맨드, 박스 700 은 4 개의 빈들 또는 타일들을 포함한다. ABC 및 BC 에 대한 쿼리들이 도 7 의 예에 예시된다. 먼저, 3 개의 메모리 로케이션들이 쿼리 ABC 에 대해 702 에서 0 으로 리셋된다. 3 개의 메모리 로케이션들은 또한, 쿼리BC 에 대해 704 에서 0 으로 리셋된다. 쿼리ABC 에 대한 쿼리 카운터 시작 값 (값 SABC) 은 쿼리ABC 메모리의 쿼리 카운터 시작 값 부분에 기입된다. 이것은 708 에서 하드웨어 커맨드들 (706) 을 사용하여 기입될 수도 있다. 일부 예들에서, 하드웨어 커맨드들 (706) 은 소프트웨어 또는 하드웨어와 소프트웨어의 일부 조합에 의해 대체될 수도 있다.
쿼리BC 는 도 7 의 예시된 예에서 네스팅된 쿼리이다. 하드웨어 커맨드들 (706) 은 쿼리BC 에 대한 쿼리 카운터 시작 값 (값 SBC) 을 710 에서 쿼리BC 메모리의 쿼리 카운터 시작 값에 기입한다. 하드웨어 커맨드들 (706) 은 쿼리ABC 에 대한 쿼리 카운터 종료 값 (값 EABC) 을 712 에서 쿼리ABC 메모리의 쿼리 카운터 종료 값에 기입한다. 누산이, 예를 들어 하드웨어 커맨드들을 사용하여 수행되고, 714 에서 쿼리ABC 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다. 유사하게, 하드웨어 커맨드들 (706) 은 쿼리BC 에 대한 쿼리 카운터 종료 값 (값 EBC) 을 716 에서 쿼리BC 메모리의 쿼리 카운터 종료 값 메모리 로케이션에 기입한다. 누산이 수행될 수도 있고, 718 에서 쿼리BC 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다.
전술된 바와 같이, 다른 예들은 각각의 쿼리에 대해 단지 1 또는 2 개의 메모리 로케이션들을 사용할 수도 있다. 예를 들어, 2 개의 메모리 로케이션 구현에서, 먼저 2 개의 메모리 로케이션들은 쿼리ABC 에 대해 3 개 보다는 0 으로 리셋되고, 2 개의 메모리 로케이션들은 또한 쿼리BC 에 대해 0 으로 리셋된다. 쿼리ABC 에 대한 쿼리 카운터 시작 값 (값 SABC) 은 쿼리ABC 메모리의 쿼리 카운터 시작 값 부분에 기입된다. 이것은 하드웨어 커맨드에 의한 것일 수도 있다.
쿼리BC 하드웨어 커맨드들 (또는 일부 예들에서 소프트웨어) 에 대해, 쿼리BC 에 대한 쿼리 카운터 시작 값 (값 SBC) 을 쿼리BC 메모리의 쿼리 카운터 시작 값에 기입하고, 쿼리ABC 에 대한 쿼리 종료 값 (값 EABC) 을 쿼리ABC 메모리의 쿼리 카운터 종료 값에 기입한다. 누산이 수행되고 쿼리 ABC 에 대한 시작 또는 정지 메모리 로케이션들 중 하나 또는 양자 모두에 기입될 수도 있다. 유사하게, 하드웨어 커맨드들은 쿼리BC 에 대한 쿼리 카운터 종료 값 (값 EBC) 을 쿼리BC 메모리의 쿼리 카운터 종료 값에 기입한다. 누산이 수행되고 쿼리 BC 에 대한 시작 또는 정지 메모리 로케이션들 중 하나 또는 양자 모두에 기입될 수도 있다. 다른 예는 메모리에 시작 카운터 값을 저장함으로써 2 개의 메모리 로케이션들을 사용할 수도 있다. 이러한 예에서, 종료 카운터 값은 메모리에 저장되지 않고 시작 카운터 값 메모리 로케이션으로부터 직접 감산된다. 누산된 결과 (감산의 결과) 는 그 후, 메모리에 저장될 수도 있다.
유사하게, 일부 예들에서 단일의 메모리 로케이션 또는 단일의 전용 메모리 로케이션이 각각의 쿼리에 대해 사용될 수도 있다. 예를 들어, 임시 메모리 또는 레지스터가 카운터 종료 값들을 저장하는데 사용될 수도 있고, 결과들은 대응하는 카운터 시작 값과 동일한 메모리 로케이션에 기입될 수도 있다. 다른 예들에서, 메모리에서의 값으로부터 차이 연산 및 카운터의 판독은 단일의 메모리 로케이션의 사용을 허용할 수도 있다. 이것은 단일의 동작으로, 카운터 시작 값을 저장하고, 그 후 정지 카운터 값을 판독하고, 시작 및 정지 카운터 값들의 차이 연산을 수행하며 결과와 시작 카운터 값을 중복기재함으로써 행해질 수도 있다. 다른 구성들이 또한, 예를 들어 다양한 결과들을 계산하기 위해 임시 메모리 로케이션들과 결합하여 쿼리에 대한 다양한 전용 메모리 로케이션들을 사용하여 가능한 것으로 이해될 것이다.
일부 예들에서, 임시 레지스터는 카운터 시작 값을 홀딩할 수도 있고, 종료 카운터 값은 메모리에 저장되지 않을 수도 있다. 시작 카운터 레지스터 값은 종료 카운터 값으로부터 직접적으로 감산되고, 그 후 최종 누산된 결과 만이 메모리 로케이션에 저장된다.
일 예에서, 일부 시스템들, 방법들, 및 디바이스들은 시작 메모리 로케이션을 포함할 수도 있지만, 종료 카운터 값을 메모리에 저장하지는 않는다. 종료 값이 직접적으로 감산될 수도 있다. 예를 들어, 시작 메모리 로케이션에 저장된 시작 카운터 값은 종료 카운터 값으로부터 감산되고, 제 2 메모리 로케이션에 저장될 수도 있다. 따라서, 이러한 예는 2 개의 메모리 로케이션들을 사용할 수도 있다.
다른 예는 1 개의 메모리 로케이션을 사용할 수도 있다. 이러한 예는 시작 카운터 값을 저장하지 않을 수도 있다. 차라리, 레지스터가 대신 사용될 수도 있다. 종료 카운터 값은 또한 저장되지 않을 수도 있지만, 차라리 레지스터에서의 시작 값은 종료 값을 메모리에 저장하지 않고 종료 값으로부터 감산될 수도 있다. 누산된 결과가 그 후, 메모리에 저장될 수도 있다.
본 개시물의 일 예에서, 시스템, 방법, 또는 장치는 쿼리를 수행하고, 3D 장면을 포함하는 타일들의 수에 관계 없이 쿼리 당 단지 3 개의 메모리 로케이션들을 사용하여 누산 결과를 획득할 수도 있다. 또한, 타일 당 누산 결과는, 그것이 각각의 타일을 프로세싱할 때 GPU (12) 에 의해 행해질 수도 있다. 최종 타일이 GPU (12) 에 의해 프로세싱된 후에, 최종 누산된 결과는 이미 이용 가능할 수도 있다.
다른 예에서, 시스템, 방법, 또는 장치는 3D 장면을 포함하는 타일들의 수에 관계 없이 쿼리 당 단지 2 개 이하의 메모리 로케이션들을 사용하여 쿼리 결과를 획득할 수도 있다. 상기 예와 유사하게, 타일-당 결과의 누산은 그것이 각각의 타일을 프로세싱할 때 GPU (12) 에 의해 행해질 수도 있다. 다시, 최종 타일이 GPU (12) 에 의해 프로세싱된 후에, 최종 누산된 결과는 이미 이용 가능할 수도 있다.
일부 예들에서, 도 3 의 Tri A, Tri B 및 Tri C 를 드로잉하기 위한 렌더링 커맨드들은 네 번-모든 타일에 대해 한 번 실행될 것이다. 차폐 쿼리 카운터들을 리셋, 시작, 및 정지하기 위한 하드웨어 커맨드들, 및 카운터 값들을 기입하기 위한 커맨드들은 각각의 타일에 대해 실행될 수도 있다.
일부 예들에서, 네스팅된 차폐 쿼리들이 허용될 수도 있다. 이것 때문에, 카운터, 예를 들어 하드웨어 또는 소프트웨어 카운터를 모든 타일에서 리셋하는 것이 가능하지 않을 수도 있다. 일 예는 타일 당 시작 및 종료 카운터 값을 저장할 필요가 있을 수도 있다.
일 예에서, 쿼리 프로세싱은 더 메모리 효율적일 수도 있다. 일부 예들은, 예를 들어 본 개시물의 기법들을 구현하는 프로세서의 수학적 프로세싱 성능들에 따라 쿼리 당 단지 3, 2, 또는 심지어 1 개의 메모리 로케이션들을 유지할 수도 있다.
예를 들어, 일부 시스템들, 방법들, 또는 장치가 그래픽 프로세싱 시스템에서 차폐 쿼리들을 수행할 수도 있다. 이것은 차폐 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하는 것을 포함할 수도 있다. 이 시작 값은 제 1 메모리 로케이션에 저장될 수도 있다. 일 예에서, 러닝 카운터는 별개의 그래픽 엔티티들을 카운트한다. 본 개시물의 예시의 시스템들, 방법들, 또는 장치들은 차폐 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정할 수도 있다. 이 종료 값은 제 2 메모리 로케이션에 저장될 수도 있다. 부가적으로, 이들 시스템들, 방법들, 또는 장치는 종료 값으로부터 시작 값을 감산하여 결과를 결정할 수도 있다. 이 값은 제 3 메모리 로케이션에 저장될 수도 있다. 다른 예에서, 시작 값은 제 1 메모리 로케이션에 저장될 수도 있다. 부가적으로, 종료 값은 제 2 메모리 로케이션에 저장될 수도 있고, 종료 값으로부터 시작 값의 감산으로부터 결정된 값, 즉 결과는 제 1 및 제 2 메모리 로케이션들 중 하나 이상에 저장될 수도 있고, 따라서 2 개의 메모리 로케이션들 만을 요구한다. 또 다른 예에서, 카운트 값이 원-스텝으로 판독 및 프로세싱될 수도 있으면, 시작 값은 제 1 메모리 로케이션에 저장될 수도 있다. 종료 카운트 값이 판독될 수도 있고, 이 결과와 단일의 스텝으로 프로세싱된 2 개의 값들은 가능하게는, 제 1 메모리 로케이션에 저장되며 따라서 1 개의 메모리 로케이션 만을 요구한다.
일부 예들에서, 결과 누산은 각각의 타일이 프로세싱될 때 (CPU (6) 대신에) GPU (12) 에 의해 수행될 수도 있다. 모든 타일들이 렌더링된 후에, 최종 쿼리 결과는 예를 들어, "누산된 최종 결과" 메모리 로케이션에서 이용 가능하다.
그래픽 프로세싱 시스템에서 차폐 쿼리들을 수행하는 예시의 방법은 차폐 쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하는 것을 포함할 수도 있다. 러닝 카운터는 별개의 그래픽 엔티티들을 카운트할 수도 있다. 방법은 차폐 쿼리의 종료에서 러닝 카운터를 판독하여 종료 값을 결정하고, 종료 값으로부터 시작 값을 감산하여 결과를 결정하는 것을 포함할 수도 있다. 별개의 그래픽 엔티티들은 픽셀들 또는 폴리곤들일 수도 있다.
일 예에서, 시작 값은 제 1 메모리 로케이션에 저장되고, 종료 값은 제 2 메모리 로케이션에 저장되며, 그 결과는 제 3 메모리 로케이션에 저장된다. 다른 예에서, 시작 값은 제 1 메모리 로케이션에 저장되고, 종료 값은 제 2 메모리 로케이션에 저장되며, 그 결과는 제 1 또는 제 2 메모리 로케이션 중 하나에 중복기재된다.
일 예에서, 네스팅은 (1) 제 2 차폐 쿼리의 시작에서 러닝 카운터를 판독하여 제 2 시작 값을 결정하고, (2) 제 2 차폐 쿼리의 종료에서 러닝 카운터를 판독하여 제 2 종료 값을 결정하며, (3) 제 2 시작 값을 제 2 종료 값으로부터 감산하여 결과를 결정함으로써 수행될 수도 있다.
이들 예시의 방법들 중 하나 이상이 결합될 수도 있다. 부가적으로, 다양한 디바이스들, 시스템들, 및 장치가 이들 방법들을 구현할 수도 있다.
도 8 은 본 개시물의 하나 이상의 양태들을 구현하는 예시의 방법을 나타내는 흐름도이다. 프로세서, 예컨대 GPU (12), CPU (6), 또는 다른 프로세싱 로직은, 프로세서로 하여금 쿼리의 시작에서 카운터 (44) 를 판독하여 시작 값을 결정하게 하는 (800) 소프트웨어를 실행할 수도 있다. 카운터 (44)(도 2) 는 별개의 그래픽 엔티티들을 카운트하는 러닝 카운터일 수도 있다. 카운터 (44) 는 버스 (18) 에 접속될 수도 있고, 이로써 프로세서에 의해 액세스될 수도 있다. 다른 예들에서, 카운터 (44) 는 메모리 (10) 의 부분일 수도 있다.
전술된 바와 같이, 다양한 예들에서 프로세서 (예를 들어, GPU (12) 또는 CPU (6)) 는 카운터 (44) 로부터 판독된 값들, 예컨대 시작 값을 저장하기 위해 메모리 (10) 를 사용할 수도 있다. 예를 들어, 시작 값은 메모리 (10), 레지스터, 또는 일부 다른 메모리 또는 스토리지 로케이션에 저장될 수도 있다. 일 예에서, 쿼리가 시작할 때 그 쿼리에 대한 카운터 시작 값이 판독될 수도 있다. 이 값은 그 후, 쿼리 메모리의 쿼리 카운터 시작 값 부분에 기입될 수도 있다. 예를 들어, 도 6 에 예시된 바와 같이, 시작 값은 쿼리ABC 결과 메모리 로케이션들 차폐 쿼리 카운터 시작 값에 기입될 수도 있다.
소프트웨어는 또한, 프로세서로 하여금 쿼리의 종료에서 카운터 (44) 를 판독하여 종료 값을 결정하게 할 수도 있다 (802). 부가적으로, 종료 값은 또한, 메모리 (10), 레지스터, 또는 일부 다른 메모리 또는 스토리지 로케이션에 저장될 수도 있다. 예를 들어, 쿼리ABC 에 대한 쿼리 종료 값 (값 EABC) 은 도 6 의 쿼리ABC 결과 메모리의 차폐 쿼리 카운터 종료 값에 기입될 수도 있다. 누산이, 예를 들어 CPU (6) 또는 GPU (12) 와 같은 프로세서에 의해 수행될 수도 있고, 그 결과는 쿼리ABC 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다. 유사하게, 쿼리BC 가 완료되는 경우, 하드웨어 커맨드들은 쿼리BC 에 대한 쿼리 카운터 종료 값 (값 EBC) 을 쿼리BC 결과 메모리의 쿼리 카운터 종료 값 메모리 로케이션에 기입할 수도 있다. 누산이, 예를 들어 CPU (6) 또는 GPU (12) 와 같은 프로세서에 의해 수행될 수도 있고, 그 결과는 쿼리BC 결과 메모리의 누산된 최종 결과 메모리 로케이션에 기입될 수도 있다.
카운터 (44) 는 쿼리의 시작 이래로 프로세싱되었던 별개의 그래픽 엔티티들의 수만큼 시작 값과 종료 값 사이에서 증가되었을 수도 있다. 이들 2 개의 값들 간의 차이는 쿼리 동안 발생했던 카운트들의 수를 나타낸다. 따라서, 소프트웨어는 또한, 프로세서로 하여금 종료 값으로부터 시작 값을 감산하여 결과를 결정하게 할 수도 있다 (804). 예를 들어, 시작 값은 메모리 (10) 로부터 판독되고, 그 후 종료 값에서 감산되며, 이것은 레지스터에 저장될 수도 있다. 종료 값은 또한, 메모리 (10), 레지스터, 또는 일부 다른 메모리 또는 스토리지 로케이션에 저장될 수도 있다.
일부 예들에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 3 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 다른 예에서, 시작 값은 제 1 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 종료 값은 제 2 메모리 로케이션에, 예를 들어 메모리 (10) 에 저장될 수도 있다. 결과는 제 1 또는 제 2 메모리 로케이션들 중 하나를 중복기재할 수도 있다.
일부 예들은 제 2 쿼리를 네스팅하는 것을 더 포함할 수도 있다. 네스팅은 제 2 쿼리의 시작에서 러닝 카운터를 판독하여 제 2 시작 값을 결정하고, 제 2 쿼리의 종료에서 러닝 카운터를 판독하여 제 2 종료 값을 결정하며, 제 2 시작 값을 제 2 종료 값으로부터 감산하여 결과를 결정함으로써 행해질 수도 있다.
본 개시물에서 설명된 기술들은, 적어도 부분적으로, 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 예를 들어, 설명된 기술들의 여러 양태들은, 하나 이상의 마이크로프로세서들을 포함하는 하나 이상의 프로세서들, 디지털 신호 프로세서들(DSPs), ASIC들, FPGA들, 또는 다른 등가적인 집적 또는 이산 논리 회로부 뿐만 아니라 이러한 컴포넌트들의 임의의 조합들 내에서 구현될 수도 있다. 일반적으로, 용어 "프로세서" 또는 "프로세싱 회로부"는 임의의 전술한 논리 회로부만을 지칭할 수도 있거나, 또는 다른 논리 회로부 또는 임의의 다른 등가의 회로부, 예컨대 프로세싱을 수행하는 이산 하드웨어와 조합하여 지칭할 수도 있다.
이러한 하드웨어, 소프트웨어, 및 펌웨어는 본 개시물에서 설명된 여러 동작들 및 기능들을 지지하기 위해 동일한 디바이스 내에서 또는 별개의 디바이스들 내에서 구현될 수도 있다. 또한, 설명된 유닛들, 모듈들 또는 컴포넌트들 중 임의의 것이 함께 또는 독립된 그러나 상호 동작가능한 로직 디바이스들로서 별개로 구현될 수도 있다. 모듈들 또는 유닛들로서의 상이한 피처들의 묘사는 상이한 기능의 양태들을 강조하기 위해 의도된 것이며, 이러한 모듈들 또는 유닛들이 반드시 별개의 하드웨어 또는 소프트웨어 컴포넌트들에 의해 실현되어야만 하는 것을 의미하는 것은 아니다. 차라리, 하나 이상의 모듈들 또는 유닛들과 관련된 기능성은 별개의 하드웨어, 펌웨어, 및/또는 소프트웨어 컴포넌트들에 의해 수행될 수도 있거나, 또는 공통의 또는 별개의 하드웨어 또는 소프트웨어 컴포넌트들 내에 통합될 수도 있다.
본 개시물에 설명된 기법들은 또한, 명령들을 저장하는 컴퓨터 판독가능 저장 매체와 같은 컴퓨터 판독가능 매체에 저장, 구현 또는 인코딩될 수도 있다. 컴퓨터 판독가능 매체에서 구현 또는 인코딩된 명령들은, 예를 들어 그 명령들이 하나 이상의 프로세서들에 의해 실행되는 경우, 하나 이상의 프로세서들로 하여금 본원에 설명된 기법들을 수행하게 할 수도 있다. 컴퓨터 판독가능 저장 매체는 랜덤 액세스 메모리 (RAM), 판독 전용 메모리 (ROM), 프로그램가능 판독 전용 메모리 (PROM), 소거가능한 프로그램가능 판독 전용 메모리 (EPROM), 전기적으로 소거가능한 프로그램가능 판독 전용 메모리 (EEPROM), 플래시 메모리, 하드디스크, CD-ROM, 플로피디스크, 카세트, 자기 매체들, 광학 매체들, 또는 유형의 다른 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다.
컴퓨터 판독가능 매체는, 상기에서 나열된 것들과 같은 유형의 저장 매체에 대응하는 컴퓨터 판독가능 저장 매체를 포함할 수도 있다. 컴퓨터 판독가능 매체는 또한, 예를 들어 통신 프로토콜에 따라 한 장소에서 다른 장소로 컴퓨터 프로그램의 전송을 용이하게 하는 임의의 매체를 포함하는 통신 매체를 포함할 수도 있다. 이 방식에서, 문구 "컴퓨터 판독가능 매체"는 일반적으로 (1) 비일시적인 유형의 컴퓨터 판독가능 저장 매체, 및 (2) 일시적인 신호 또는 반송파와 같은 비-유형의 컴퓨터 판독가능 통신 매체에 대응할 수도 있다.
다양한 양태들 및 예들이 설명되었다. 그러나, 다음의 청구항들의 범위로부터 벗어나지 않고 본 개시물의 기법들 또는 구조에 대한 변형들이 이루어질 수 있다.
Claims (33)
- 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법으로서,
쿼리의 시작에서 러닝 카운터 (running counter) 를 판독하여 시작 값을 결정하는 단계로서, 상기 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하는, 상기 시작 값을 결정하는 단계;
상기 쿼리의 종료에서 상기 러닝 카운터를 판독하여 종료 값을 결정하는 단계; 및
상기 종료 값으로부터 상기 시작 값을 감산하여 결과를 결정하는 단계를 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 별개의 그래픽 엔티티들은 픽셀들을 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 별개의 그래픽 엔티티들은 폴리곤들을 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 시작 값은 제 1 메모리 로케이션에 저장되고, 상기 종료 값은 제 2 메모리 로케이션에 저장되며, 상기 결과는 제 3 메모리 로케이션에 저장되는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 시작 값은 제 1 메모리 로케이션에 저장되고, 상기 종료 값은 제 2 메모리 로케이션 저장되며, 상기 결과는 상기 제 1 메모리 로케이션 또는 상기 제 2 메모리 로케이션 중 하나에 중복기재 (overwrite) 되는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
제 2 쿼리의 시작에서 상기 러닝 카운터를 판독하여 제 2 시작 값을 결정하고;
상기 제 2 쿼리의 종료에서 상기 러닝 카운터를 판독하여 제 2 종료 값을 결정하며;
상기 제 2 종료 값으로부터 상기 제 2 시작 값을 감산하여 제 2 결과를 결정함으로써,
상기 제 2 쿼리를 네스팅하는 단계를 더 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 6 항에 있어서,
제 3 네스팅된 쿼리를 실행하는 단계를 더 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 쿼리는 차폐 쿼리를 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 쿼리는 타임스탬프 쿼리를 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 제 1 항에 있어서,
상기 쿼리는 파이프라인 스테이터스 쿼리를 포함하는, 그래픽 프로세싱 시스템에서 쿼리들을 수행하는 방법. - 하나 이상의 프로세서들을 포함하는 비디오 데이터를 코딩하기 위한 장치로서,
쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하는 것으로서, 상기 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하는, 상기 시작 값을 결정하고;
상기 쿼리의 종료에서 상기 러닝 카운터를 판독하여 종료 값을 결정하며;
상기 종료 값으로부터 상기 시작 값을 감산하여 결과를 결정하도록 구성되는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 별개의 그래픽 엔티티들은 픽셀들을 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 별개의 그래픽 엔티티들은 폴리곤들을 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 하나 이상의 프로세서들은 또한, 상기 시작 값을 제 1 메모리 로케이션에 저장하고, 상기 종료 값을 제 2 메모리 로케이션에 저장하며, 상기 결과를 제 3 메모리 로케이션에 저장하도록 구성되는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 하나 이상의 프로세서들은 또한, 상기 시작 값을 제 1 메모리 로케이션에 저장하고, 상기 종료 값을 제 2 메모리 로케이션에 저장하며, 상기 결과를 상기 제 1 메모리 로케이션 또는 상기 제 2 메모리 로케이션 중 하나에 중복기재하도록 구성되는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 하나 이상의 프로세서들은 또한,
제 2 쿼리의 시작에서 상기 러닝 카운터를 판독하여 제 2 시작 값을 결정하고;
상기 제 2 쿼리의 종료에서 상기 러닝 카운터를 판독하여 제 2 종료 값을 결정하며;
상기 제 2 종료 값으로부터 상기 제 2 시작 값을 감산하여 제 2 결과를 결정하도록 구성되는, 비디오 데이터를 코딩하기 위한 장치. - 제 16 항에 있어서,
상기 하나 이상의 프로세서들은 또한, 제 3 네스팅된 쿼리를 실행하도록 구성되는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 쿼리는 차폐 쿼리를 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 쿼리는 타임스탬프 쿼리를 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 11 항에 있어서,
상기 쿼리는 파이프라인 스테이터스 쿼리를 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 비디오 데이터를 코딩하기 위한 장치로서,
쿼리의 시작에서 러닝 카운터 (running counter) 를 판독하여 시작 값을 결정하는 수단으로서, 상기 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하는, 상기 시작 값을 결정하는 수단;
상기 쿼리의 종료에서 상기 러닝 카운터를 판독하여 종료 값을 결정하는 수단; 및
상기 종료 값으로부터 상기 시작 값을 감산하여 결과를 결정하는 수단을 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 21 항에 있어서,
상기 별개의 그래픽 엔티티들은 픽셀들을 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 21 항에 있어서,
상기 별개의 그래픽 엔티티들은 폴리곤들을 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 21 항에 있어서,
상기 시작 값을 제 1 메모리 로케이션에 저장하는 수단, 상기 종료 값을 제 2 메모리 로케이션에 저장하는 수단, 및 상기 결과를 제 3 메모리 로케이션에 저장하는 수단을 더 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 21 항에 있어서,
상기 시작 값을 제 1 메모리 로케이션에 저장하는 수단, 상기 종료 값을 제 2 메모리 로케이션에 저장하는 수단, 및 상기 결과를 상기 제 1 메모리 로케이션 또는 상기 제 2 메모리 로케이션 중 하나에 중복기재하는 수단을 더 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 제 21 항에 있어서,
제 2 쿼리의 시작에서 상기 러닝 카운터를 판독하여 제 2 시작 값을 결정하는 수단;
상기 제 2 쿼리의 종료에서 상기 러닝 카운터를 판독하여 제 2 종료 값을 결정하는 수단; 및
상기 제 2 종료 값으로부터 상기 제 2 시작 값을 감산하여 제 2 결과를 결정하는 수단에 의해,
상기 제 2 쿼리를 네스팅하는 수단을 더 포함하는, 비디오 데이터를 코딩하기 위한 장치. - 명령들이 저장되어 있는 컴퓨터 판독가능 저장 매체로서,
상기 명령들은 디바이스의 하나 이상의 프로세서들로 하여금,
쿼리의 시작에서 러닝 카운터를 판독하여 시작 값을 결정하게 하는 것으로서, 상기 러닝 카운터는 별개의 그래픽 엔티티들을 카운트하는, 상기 시작 값을 결정하게 하고;
상기 쿼리의 종료에서 상기 러닝 카운터를 판독하여 종료 값을 결정하게 하며;
상기 종료 값으로부터 상기 시작 값을 감산하여 결과를 결정하게 하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
상기 별개의 그래픽 엔티티들은 픽셀들을 포함하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
상기 별개의 그래픽 엔티티들은 폴리곤들을 포함하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
상기 명령들은, 실행되는 경우 상기 디바이스의 상기 하나 이상의 프로세서들로 하여금,
상기 시작 값을 제 1 메모리 로케이션에 저장하게 하고, 상기 종료 값을 제 2 메모리 로케이션에 저장하게 하며, 상기 결과를 제 3 메모리 로케이션에 저장하게 하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
상기 명령들은, 실행되는 경우 상기 디바이스의 상기 하나 이상의 프로세서들로 하여금,
상기 시작 값을 제 1 메모리 로케이션에 저장하게 하고, 상기 종료 값을 제 2 메모리 로케이션에 저장하게 하며, 상기 결과를 상기 제 1 메모리 로케이션 또는 상기 제 2 메모리 로케이션 중 하나에 중복기재하게 하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
제 2 쿼리의 시작에서 상기 러닝 카운터를 판독하여 제 2 시작 값을 결정하고;
상기 제 2 쿼리의 종료에서 상기 러닝 카운터를 판독하여 제 2 종료 값을 결정하며;
상기 제 2 종료 값으로부터 상기 제 2 시작 값을 감산하여 제 2 결과를 결정함으로써,
상기 제 2 쿼리를 네스팅하기 위한 명령들을 더 포함하는, 컴퓨터 판독가능 저장 매체. - 제 27 항에 있어서,
상기 쿼리는 차폐 쿼리를 포함하는, 컴퓨터 판독가능 저장 매체.
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201361817154P | 2013-04-29 | 2013-04-29 | |
US61/817,154 | 2013-04-29 | ||
US14/014,118 US9589314B2 (en) | 2013-04-29 | 2013-08-29 | Query processing for tile-based renderers |
US14/014,118 | 2013-08-29 | ||
PCT/US2014/034833 WO2014179097A1 (en) | 2013-04-29 | 2014-04-21 | Query processing for tile-based renderers |
Publications (1)
Publication Number | Publication Date |
---|---|
KR20160003101A true KR20160003101A (ko) | 2016-01-08 |
Family
ID=51788876
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020157033589A KR20160003101A (ko) | 2013-04-29 | 2014-04-21 | 타일-기반 렌더러들에 대한 쿼리 프로세싱 |
Country Status (6)
Country | Link |
---|---|
US (1) | US9589314B2 (ko) |
EP (1) | EP2992511A1 (ko) |
JP (1) | JP2016520909A (ko) |
KR (1) | KR20160003101A (ko) |
CN (1) | CN105144244B (ko) |
WO (1) | WO2014179097A1 (ko) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9569883B2 (en) * | 2013-12-12 | 2017-02-14 | Intel Corporation | Decoupled shading pipeline |
US9842428B2 (en) * | 2014-06-27 | 2017-12-12 | Samsung Electronics Co., Ltd. | Dynamically optimized deferred rendering pipeline |
US9298769B1 (en) * | 2014-09-05 | 2016-03-29 | Futurewei Technologies, Inc. | Method and apparatus to facilitate discrete-device accelertaion of queries on structured data |
US10535114B2 (en) * | 2015-08-18 | 2020-01-14 | Nvidia Corporation | Controlling multi-pass rendering sequences in a cache tiling architecture |
US10885603B2 (en) * | 2015-12-25 | 2021-01-05 | Intel Corporation | Alpha blending and display update bandwidth saving during render and display operations |
GB201713052D0 (en) * | 2017-08-15 | 2017-09-27 | Imagination Tech Ltd | Single pass rendering for head mounted displays |
US10672182B2 (en) * | 2018-04-19 | 2020-06-02 | Microsoft Technology Licensing, Llc | Compact visibility state for GPUs compatible with hardware instancing |
CN111209116B (zh) * | 2020-01-06 | 2023-09-12 | 西安芯瞳半导体技术有限公司 | 一种分配显存空间的方法、装置及计算机存储介质 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6636215B1 (en) | 1998-07-22 | 2003-10-21 | Nvidia Corporation | Hardware-assisted z-pyramid creation for host-based occlusion culling |
US6952206B1 (en) | 2002-08-12 | 2005-10-04 | Nvidia Corporation | Graphics application program interface system and method for accelerating graphics processing |
GB0425204D0 (en) * | 2004-11-15 | 2004-12-15 | Falanx Microsystems As | Processing of 3-dimensional graphics |
US7425956B1 (en) | 2005-06-21 | 2008-09-16 | Nvidia Corporation | System and method for occlusion testing with deferred rendering |
US7519797B1 (en) * | 2006-11-02 | 2009-04-14 | Nividia Corporation | Hierarchical multi-precision pipeline counters |
EP2313847A4 (en) * | 2008-08-19 | 2015-12-09 | Digimarc Corp | METHODS AND SYSTEMS FOR PROCESSING CONTENT |
US8471858B2 (en) | 2009-06-02 | 2013-06-25 | Qualcomm Incorporated | Displaying a visual representation of performance metrics for rendered graphics elements |
JP5392199B2 (ja) * | 2010-07-09 | 2014-01-22 | ソニー株式会社 | 画像処理装置および方法 |
US8902228B2 (en) * | 2011-09-19 | 2014-12-02 | Qualcomm Incorporated | Optimizing resolve performance with tiling graphics architectures |
GB201116438D0 (en) * | 2011-09-22 | 2011-11-02 | Advanced Risc Mach Ltd | Occlusion queries in graphics processing |
-
2013
- 2013-08-29 US US14/014,118 patent/US9589314B2/en not_active Expired - Fee Related
-
2014
- 2014-04-21 WO PCT/US2014/034833 patent/WO2014179097A1/en active Application Filing
- 2014-04-21 JP JP2016510721A patent/JP2016520909A/ja not_active Ceased
- 2014-04-21 EP EP14725891.7A patent/EP2992511A1/en not_active Withdrawn
- 2014-04-21 KR KR1020157033589A patent/KR20160003101A/ko not_active Application Discontinuation
- 2014-04-21 CN CN201480023170.XA patent/CN105144244B/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2016520909A (ja) | 2016-07-14 |
WO2014179097A1 (en) | 2014-11-06 |
EP2992511A1 (en) | 2016-03-09 |
CN105144244B (zh) | 2018-06-15 |
CN105144244A (zh) | 2015-12-09 |
US20140320512A1 (en) | 2014-10-30 |
US9589314B2 (en) | 2017-03-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9483861B2 (en) | Tile-based rendering | |
US9589314B2 (en) | Query processing for tile-based renderers | |
US10885607B2 (en) | Storage for foveated rendering | |
KR101800987B1 (ko) | 계층적 z-컬링을 수행하기 위한 부분적으로-커버된 타일들의 선택적 병합 | |
KR101728624B1 (ko) | 타일 기반 렌더링을 위한 인트라-프레임 타임스탬프들 | |
KR102475212B1 (ko) | 타일식 아키텍처들에서의 포비티드 렌더링 | |
US9569862B2 (en) | Bandwidth reduction using texture lookup by adaptive shading | |
CN107003964B (zh) | 处理未对准块传送操作 | |
US9659399B2 (en) | System, method, and computer program product for passing attribute structures between shader stages in a graphics pipeline | |
US10078883B2 (en) | Writing graphics data from local memory to system memory | |
US9230362B2 (en) | System, method, and computer program product for using compression with programmable sample locations | |
TWI514315B (zh) | 取樣階層式深度地圖的系統、方法,及電腦程式產品 | |
US9721381B2 (en) | System, method, and computer program product for discarding pixel samples | |
US10580151B2 (en) | Tile-based low-resolution depth storage | |
US20180293761A1 (en) | Multi-step texture processing with feedback in texture unit | |
US9305388B2 (en) | Bit-count texture format |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
WITN | Withdrawal due to no request for examination |