KR20140039076A - 셰이더 동작의 동기화 - Google Patents

셰이더 동작의 동기화 Download PDF

Info

Publication number
KR20140039076A
KR20140039076A KR1020147004184A KR20147004184A KR20140039076A KR 20140039076 A KR20140039076 A KR 20140039076A KR 1020147004184 A KR1020147004184 A KR 1020147004184A KR 20147004184 A KR20147004184 A KR 20147004184A KR 20140039076 A KR20140039076 A KR 20140039076A
Authority
KR
South Korea
Prior art keywords
shader
constructor
buffer
graphic data
generator
Prior art date
Application number
KR1020147004184A
Other languages
English (en)
Other versions
KR101630996B1 (ko
Inventor
앤드류 그루버
Original Assignee
퀄컴 인코포레이티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 퀄컴 인코포레이티드 filed Critical 퀄컴 인코포레이티드
Publication of KR20140039076A publication Critical patent/KR20140039076A/ko
Application granted granted Critical
Publication of KR101630996B1 publication Critical patent/KR101630996B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/544Buffers; Shared memory; Pipes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)

Abstract

본 개시물에서 설명되는 예시적인 기법들은 생성자 셰이더들과 소비자 셰이더들 (24) 사이에서의 동기화에 관한 것일 수도 있다. 예를 들어, 그래픽 프로세싱 유닛 (GPU) 은 그래픽 데이터를 생성하도록 생성자 셰이더를 실행시킬 수도 있다. 그래픽 데이터의 생성의 완료 후, 생성자 셰이더는 생성된 그래픽 데이터 (18) 의 양을 나타내는 값을 저장할 수도 있다. GPU 는 생성된 그래픽 데이터의 양을 나타내는 값의 저장 후에, 생성된 그래픽 데이터를 소비하도록 하나 이상의 소비자 셰이더들을 실행시킬 수도 있다.

Description

셰이더 동작의 동기화{SYNCHRONIZATION OF SHADER OPERATION}
본 개시물은 그래픽 셰이더들에 관한 것으로, 보다 구체적으로는, 그래픽 프로세싱 유닛 (GPU) 상에서의 하나 이상의 그래픽 셰이더들의 실행에 관한 것이다.
가시적 콘텐츠를 생성하는 디바이스는 일반적으로 그래픽 프로세싱 유닛 (GPU) 을 포함한다. GPU 는 디스플레이 상의 픽셀들에 대한 픽셀 값들을 생성하기 위해 그래픽 데이터를 프로세싱할 수도 있다. 그래픽 데이터를 프로세싱하기 위해, GPU 는 하나 이상의 셰이더 프로그램들 (종종 셰이더들이라고 지칭됨) 을 실행시킬 수도 있다. 셰이더 프로그램은 GPU 로 하여금 GPU 가 셰이더 프로그램을 실행시킬 때 셰이더 프로그램에 의해 정의된 기능들을 수행하게 하는 소프트웨어 프로그램일 수도 있다. 예를 들어, 셰이더 프로그램은 GPU 가 디스플레이 상의 픽셀들에 대한 픽셀 값들을 생성하기 위해 그래픽 데이터를 프로세싱해야 하는 방식을 정의할 수도 있다.
전반적으로, 본 개시물은 그래픽 프로세싱 유닛 (GPU) 상에서의 하나 이상의 셰이더 프로그램들의 실행을 동기화시키는 기법들을 설명한다. 몇몇 예들에서, 하나의 셰이더 프로그램은 다른 셰이더 프로그램에 의해 소비되거나 또는 이용되는 그래픽 데이터를 생성할 수도 있다. 그래픽 데이터를 생성하는 셰이더 프로그램은 생성자 셰이더 (producer shader) 로 지칭될 수도 있고, 생성된 데이터를 소비하는 셰이더 프로그램은 소비자 셰이더로 지칭될 수도 있다. 본 개시물에서 설명되는 예시적인 기법들 중 일부는 GPU 로 하여금 생성자 셰이더가 소비자 셰이더에 의해 소비될 그래픽 데이터를 생성할 때까지 GPU 가 소비자 셰이더를 실행하지 않도록 생성자 및 소비자 셰이더들의 실행을 동기화하게 할 수도 있다.
일 예에서, 본 개시물은, 그래픽 프로세싱 유닛 (GPU) 을 사용하여, 그래픽 데이터를 생성하는 생성자 셰이더를 실행시키는 단계, 및 GPU 를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하는 단계를 포함하는 방법을 설명한다. 이 방법은, 그래픽 데이터의 생성의 완료 시, GPU 상에서 실행시키는 생성자 셰이더를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하는 단계를 더 포함한다.
다른 예에서, 본 개시물은 제 1 버퍼, 제 2 버퍼, 및 그래픽 프로세싱 유닛 (GPU) 을 포함하는 장치를 설명한다. GPU 는, 그래픽 데이터를 생성하는 생성자 셰이더를 실행시키도록, 그리고 생성자 셰이더에 의해 생성된 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하도록 동작가능하다. GPU 는, 또한, 그래픽 데이터의 생성의 완료 시, GPU 상에서 실행시키는 생성자 셰이더를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하도록 동작가능하다.
다른 예에서, 본 개시물은 제 1 버퍼, 제 2 버퍼, 및 그래픽 프로세싱 유닛 (GPU) 을 포함하는 장치를 설명한다. GPU 는, 그래픽 데이터를 생성하는 생성자 셰이더를 실행시키는 수단, 및 생성자 셰이더에 의해 생성된 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하는 수단을 포함한다. GPU 는, 또한, 그래픽 데이터의 생성의 완료 시, GPU 상에서 실행시키는 생성자 셰이더를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하는 수단을 포함한다.
다른 예에서, 본 개시물은 비일시적 컴퓨터 판독가능 저장 매체를 설명한다. 비일시적 컴퓨터 판독가능 저장 매체는, 하나 이상의 프로세서들로 하여금, 그래픽 프로세싱 유닛 (GPU) 을 사용하여, 그래픽 데이터를 생성하는 생성자 셰이더를 실행시키게 하고, 그리고 GPU 를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하게 하는 명령들을 포함한다. 명령들은, 또한, 그래픽 데이터의 생성의 완료 시, GPU 상에서 실행시키는 생성자 셰이더를 사용하여, 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하게 하는 명령들을 포함한다.
하나 이상의 예들의 세부사항들은 첨부한 도면 및 하기의 설명에서 설명된다. 다른 특징들, 목적들 및 이점들은 설명 및 도면들으로부터 그리고 청구범위로부터 명확해질 것이다.
도 1 은 본 개시물의 하나 이상의 양태들을 구현하도록 동작가능할 수도 있는 그래픽 프로세싱 유닛 (GPU) 의 예를 예시한 블록도이다.
도 2 는 본 개시물의 하나 이상의 양태들을 구현하도록 도 1 의 GPU 를 포함할 수도 있는 컴퓨팅 디바이스의 예를 예시한 블록도이다.
도 3 은 본 개시물의 하나 이상의 양태들에 따라 도 1 에 도시된 바와 같은 GPU 의 예시적인 동작을 예시하는 흐름도이다.
전반적으로, 본 개시물은 그래픽 프로세싱 유닛 (GPU) 의 다양한 프로세스들의 동기화에 관한 것이다. 본 개시물의 기법들은 전반적으로 미디어 플레이어들, 셋톱 박스들, 모바일 전화기들과 같은 무선 핸드셋들, 개인 휴대 정보 단말기들 (PDA들), 데스크톱 컴퓨터들, 랩톱 컴퓨터들, 게이밍 콘솔들, 디스플레이 디바이스들, 텔레비전들 등과 같은 비디오 디바이스들에 적용가능하다.
그래픽 데이터를 프로세싱하기 위해, GPU 는 상이한 셰이더 프로그램들을 개시 (예컨대, 실행) 시킨다. 몇몇 경우들에 있어서, 하나의 셰이더 프로그램에 의해 생성된 그래픽 데이터는 다른 셰이더 프로그램에 의해 소비된다. 예를 들어, 기하학적 셰이더는 그래픽 데이터를 수신할 수도 있고, 복수의 프리미티브들의 버텍스들의 좌표들 및 그 프리미티브들의 버텍스들의 컬러 값들 및 다른 속성들과 같은 그 프리미티브들에 대한 그래픽 데이터를 생성할 수도 있다. 픽셀 셰이더는 복수의 프리미티브들에 대한 그래픽 데이터를 수신할 수도 있고, 디스플레이 상에서의 프레젠테이션을 위해 픽셀들을 렌더링하도록 복수의 프리미티브들에 대한 그래픽 프로세싱, 이를테면 셰이딩, 일루미네이팅, 및 블렌딩을 수행할 수도 있다.
이전의 예에서, 기하학적 셰이더는 "생성자" 셰이더의 예로서 간주될 수도 있고, 픽셀 셰이더는 "소비자" 셰이더의 예로서 간주될 수도 있다. 몇몇 예들에서, GPU 는 생성자 셰이더가 그래픽 데이터를 생성하기 전에 소비자 셰이더가 그래픽 데이터를 소비하고자 하지 않도록 생성자 셰이더와 소비자 셰이더를 동기화시필 필요가 있을 수도 있다. 예를 들어, 몇몇 경우들에 있어서, GPU 는 생성자 셰이더를 실행시킬 때를 미리 알 수도 있지만, 생성자 셰이더가 얼마나 많은 그래픽 데이터를 생성할 것인지를 미리 알지는 못할 수도 있다. 생성 셰이더가 생성할 그래픽 데이터의 양이 가변적이기 때문에, GPU 는 생성자 셰이더가 그래픽 데이터의 생성을 완료할 때를 미리 알지는 못할 수도 있다.
더욱이, 몇몇 예들에서는, 다수의 생성자 셰이더들 및 다수의 소비자 셰이더들이 있을 수도 있다. 이들 예들 중 일부에서, 그래픽 데이터에 기초하여, 소비자 셰이더는 생성자 셰이더들 중 하나로부터의 그래픽 데이터를, 다른 생성자 셰이더가 그래픽 데이터의 생성을 완료할 때까지 소비할 수 없을 수도 있다. 예를 들어, GPU 가 제 1 생성자 셰이더를 실행시키고, 그 후의 어느 시간에, 제 2 생성자 셰이더를 실행시킨다는 것을 상정한다. 각각의 생성자 셰이더가 생성하는 데이터의 양에서의 가변성으로 인해, 제 1 생성자 셰이더가 그래픽 데이터의 생성을 완료하기 전에 제 2 생성자 셰이더가 그래픽 데이터의 생성을 완료하는 것이 가능할 수도 있다. 그러나, 생성자 셰이더들 각각에 의해 생성된 그래픽 데이터에 기초하여, 제 2 소비자 셰이더가 제 2 생성자 셰이더로부터의 그래픽 데이터를 소비하기 전에 제 1 소비자 셰이더는 제 1 생성자 셰이더로부터의 그래픽 데이터를 소비할 필요가 있을 수도 있다.
몇몇 예들에서, GPU 를 포함하는 디바이스는 또한 생성자 셰이더 저장 버퍼 및 생성자 셰이더 카운트 버퍼를 포함할 수도 있다. 생성자 셰이더 저장 버퍼 및 생성자 셰이더 카운트 버퍼는 동일한 메모리 디바이스 내에 형성될 수도 있고 또는 상이한 메모리 디바이스들 내에 형성될 수도 있다.
몇몇 예들에서, 생성자 셰이더 저장 버퍼는 복수의 저장 위치들을 포함할 수도 있다. GPU 는 각각의 저장 위치를 하나의 생성자 셰이더에 할당할 수도 있다. 생성자 셰이더 각각은 그의 생성된 그래픽 데이터를 생성자 셰이더 저장 버퍼 내에 있는 그의 할당된 저장 위치 내에 저장할 수도 있다. 예를 들어, 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터는 제 1 저장 위치에 저장될 수도 있고, 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터는 제 2 저장 위치에 저장되는 등으로 될 수도 있다. 이 예에서, GPU 는 제 1 저장 위치를 제 1 생성자 셰이더에, 제 2 저장 위치를 제 2 생성자 셰이더에, (추가의 생성자 셰이더들에 대해) 등으로 할당했을 수도 있다.
저장 위치들 각각의 사이즈 (예컨대, 각각의 저장 위치가 저장할 수 있는 그래픽 데이터의 양) 는 생성자 셰이더들이 생성할 수 있는 그래픽 데이터의 최대 양에 기초할 수도 있다. 예를 들어, GPU 는 생성자 셰이더가 얼마나 많은 그래픽 데이터를 생성할 것인지를 이미 알지는 못할 수도 있다; 그러나, GPU 는 생성자 셰이더들이 생성할 그래픽 데이터의 최대 양을 미리 알 수도 있다. 일 예로서, 임의의 생성자 셰이더가 생성할 수도 있는 그래픽 데이터의 최대 양은 4 킬로바이트 (KB) 일 수도 있다. 따라서, 이 예에서, GPU 가 실행시키는 모든 생성자 셰이더에 대해, GPU 는 해당 생성자 셰이더에 의해 생성된 그래픽 데이터를 저장하기 위해 생성자 셰이더 저장 버퍼 내의 4 KB 저장 위치를 그 생성자 셰이더에 할당할 수도 있다.
생성자 셰이더 카운트 버퍼는 또한 복수의 저장 위치들을 포함할 수도 있다. GPU 는 생성자 셰이더 카운트 버퍼 내의 각각의 저장 위치를 생성자 셰이더 각각에 할당할 수도 있다. GPU 가 생성자 셰이더 카운트 버퍼 내의 저장 위치 및 생성자 셰이더 저장 버퍼 내의 저장 위치를 생성자 셰이더에 할당하기 때문에, 동일한 생성자에 생성자 셰이더 카운트 버퍼 내의 각각의 저장 위치 및 생성자 셰이더 저장 버퍼 내의 각각의 저장 위치는 서로에 대해 대응하는 것으로 간주될 수도 있다.
생성자 셰이더 카운트 버퍼 내의 저장 위치들 각각은 생성자 셰이더 저장 버퍼 내에 있는 그의 대응하는 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다. 다시 말해, 생성자 셰이더 카운트 버퍼 내의 저장 위치는 생성자 셰이더 카운트 버퍼 내의 그 저장 위치에 할당된 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다.
일 예로서, 생성자 셰이더 카운트 버퍼 내의 저장 위치는 생성자 셰이더에 의해 생성된 프리미티브들의 수를 나타내는 값을 저장할 수도 있다. 예를 들어, 전술된 바와 같이, 기하학적 셰이더는 복수의 프리미티브들에 대한 그래픽 데이터를 생성할 수도 있다. 이 예에서, 기하학적 셰이더에 할당된 생성자 셰이더 카운트 버퍼 내의 저장 위치는 기하학적 셰이더에 의해 생성된 프리미티브들의 수를 나타내는 값을 저장할 수도 있다. 따라서, 생성자 셰이더 카운트 버퍼 내의 할당된 저장 위치로의, 기하학적 셰이더에 의해 생성된 프리미티브들의 수를 나타내는 값의 저장은 기하학적 셰이더가 그래픽 데이터의 생성을 완료했음을 나타낼 수도 있다.
몇몇 예들에서, 각각의 프리미티브에 대해 기하학적 셰이더에 의해 생성된 그래픽 데이터의 바이트들의 수는 일정할 수도 있다; 그러나, 기하학적 셰이더에 의해 생성된 프리미티브들의 수는 가변적일 수도 있다. 예를 들어, 기하학적 셰이더에 의해 생성된 각각의 프리미티브는 100 바이트들에 의해 정의될 수도 있다; 그러나, 기하학적 셰이더에 의해 생성된 프리미티브들의 수는 가변적일 수도 있다.
예시를 목적으로, 일 예로서, 제 1 생성자 셰이더, 예컨대 제 1 기하학적 셰이더는 5 개의 프리미티브들에 대한 데이터를 생성하고, 제 2 생성자 셰이더는 10 개의 프리미티브들에 대한 데이터를 생성한다는 것을 상정한다. 또한, 각각의 프리미티브가 100 바이트들에 의해 정의된다는 것을 상정한다. 이 예에서, 제 1 생성자 셰이더에 할당된 생성자 셰이더 카운트 버퍼 내의 저장 위치는 5 의 값을 저장할 수도 있고, 제 2 생성자 셰이더에 할당된 생성자 셰이더 카운트 버퍼 내의 저장 위치는 10 의 값을 저장할 수도 있다. 또한, 이 예에서, 제 1 생성자 셰이더에 할당된 생성자 셰이더 저장 버퍼 내의 저장 위치는 500 바이트들의 그래픽 데이터, 예컨대 5 개의 프리미티브들 * 프리미티브 당 100 바이트들을 저장할 수도 있고, 제 2 생성자에 할당된 생성자 셰이더 저장 버퍼 내의 저장 위치는 1 킬로바이트의 그래픽 데이터, 예컨대 10 개의 프리미티브들 * 프리미티브 당 100 바이트들을 저장할 수도 있다.
몇몇 예시적인 구현형태들에서, 생성자 셰이더는 각각의 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후에 생성자 셰이더 저장 버퍼 내에 있는 그의 할당된 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 출력할 수도 있다. 예를 들어, 생성자 셰이더가 그래픽 데이터를 생성하고 있을 때, GPU 는 그 생성자 셰이더에 할당된 생성자 셰이더 저장 버퍼 내의 저장 위치에, 저장을 위해, 생성된 그래픽 데이터를 출력할 수도 있다. 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후, 생성자 셰이더는, 그 생성자 셰이더에 할당된 생성자 셰이더 카운트 버퍼의 저장 위치 내에, 그 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다.
생성자 셰이더로 하여금, 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후가 될 때까지 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 출력하게 하는 적어도 2 개의 상이한 기법들이 있을 수도 있다. 일 예로서, 생성자 셰이더는 생성자 셰이더가 생성한 프리미티브들의 양을 나타내는 카운터 값을 유지하도록 설계될 수도 있다. 예를 들어, 생성자 셰이더의 프로그래머는 생성자 셰이더에 대한 소스 코드를 기록할 수도 있으며, 소스 코드의 일부는 생성자 셰이더로 하여금 생성자 셰이더가 생성한 프리미티브들의 양을 나타내는 카운터 값을 유지하게 하는 명령들일 수도 있다.
컴파일러는 오브젝트 코드를 생성하게 하는 카운터 값에 대한 명령들을 포함하는 소스 코드를 컴파일할 수도 있다. 컴파일된 오브젝트 코드로서 적용된 소스 코드의 명령들은, 실행 시, 생성자 셰이더로 하여금 그것이 모든 프리미티브를 생성한 후에 그의 카운터 값을 증분시키게 할 수도 있다. 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후, 생성자 셰이더는 그 생성자 셰이더에 할당된 카운트 버퍼 내의 저장 위치에 카운터 값을 출력할 수도 있다. 예를 들어, 소스 코드는, GPU 에 의해 실행될 때, 생성자 셰이더로 하여금 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후에 그 생성자 셰이더에 할당된 카운트 버퍼 내의 저장 위치에 카운터 값을 출력하게 하는 명령들을 포함할 수도 있다.
다른 예로서, 생성자 셰이더 프로그램들이 소스 코드에 카운터에 대한 명령들을 포함시키지 않게 하는 것이 가능할 수도 있다. 예를 들어, 몇몇 레거시 생성자 셰이더 프로그램들에 대한 소스 코드는 카운터 값에 대한 명령들, 또는 그래픽 데이터의 생성의 완료 후에 카운터 값을 출력하라는 명령들을 포함하지 않을 수도 있다. 이러한 예들에서, 컴파일러는, 컴파일링 동안, 생성자 셰이더로 하여금 카운터 값을 유지하게 하고, 그리고, 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후, 생성된 그래픽 데이터의 양을 나타내는 카운터 값을 출력하게 하는 오브젝트 코드 명령들을 삽입할 수 있도록 개발될 수도 있다.
예를 들어, GPU 외의 프로세서 상에서 실행하는 컴파일러는, 생성자 셰이더 각각의 소스 코드를 컴파일하도록 구성될 수도 있으며, GPU 에 의해 실행가능한 명령들, 예컨대 생성자 셰이더의 오브젝트 코드를 생성하도록, 그리고 GPU 로 하여금 생성자 셰이더의 기능들을 수행하게 하도록 구성될 수도 있다. 생성자 셰이더의 명령들, 예컨대 생성자 셰이더의 오브젝트 코드를 생성함에 있어서, 컴파일러는, 실행 시, 생성자 셰이더로 하여금 생성자 셰이더의 기능들을 수행하게 하는 명령들 외에도, 실행 시, 생성자 셰이더로 하여금, 생성자 셰이더가 생성한 프리미티브들의 양을 나타내는 카운터 값을 유지하게 하는 명령들을 포함할 수도 있다. 컴파일러는, 또한, 생성자 셰이더로 하여금 생성자 셰이더에 포함된 카운터 값을 출력하게 하는 생성자 셰이더의 오브젝트 코드에서의 명령들을, 생성자 셰이더가 그래픽 데이터의 생성을 완료한 후에 그 생성자 셰이더에 할당된 카운트 버퍼 내의 저장 위치에 포함시킬 수도 있다.
이 방식으로, 생성자 셰이더의 소스 코드가 카운터 값 (예컨대, 카운터 값에 대한 명령들) 을 포함하지 않는 예들에서도, 본 개시물의 양태들은 컴파일러가 카운터 값의 생성에 대한 명령들을 생성자 셰이더의 오브젝트 코드 내로 포함시키게 할 수도 있다. 예를 들어, 컴파일러는 오브젝트 코드를 생성하기 위해 생성자 셰이더의 소스 코드를 컴파일할 수도 있다. 오브젝트 코드를 생성하는 프로세스에서, 컴파일러는 카운터 값에 대한 명령들을 오브젝트 코드 내로 포함시킬 수도 있다. 전술된 바와 같이, 카운터 값은 생성자 셰이더가 그래픽 데이터를 생성하고 있는 동안 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 카운트할 수도 있다.
GPU 는 생성자 셰이더 카운트 버퍼의 저장 위치들 각각에 저장된 카운트 값에 기초하여 소비자 셰이더들을 실행시킬 수도 있다. 몇몇 예들에서, GPU 는 각각의 카운트 값마다 하나의 소비자 셰이더를 실행시킬 수도 있다. 예를 들어, 생성자 셰이더 카운트 버퍼에서의 저장 위치가 5 의 카운트 값을 저장했다면, GPU 는 생성자 셰이더 저장 버퍼 내의 대응하는 저장 위치에 저장된 그래픽 데이터를 프로세싱하도록 5 개의 소비자 셰이더들을 실행시킬 수도 있다.
몇몇 예들에서, 생성자 셰이더 카운트 버퍼는 정렬된 (ordered) 생성자 셰이더 카운트 버퍼로서 간주될 수도 있다. 예를 들어, GPU 는 생성자 셰이더 카운트 버퍼 내의 제 1 저장 위치를 임의의 다른 생성자 셰이더로부터의 그래픽 데이터가 소비되기 전에 소비되어야 하는 그래픽 데이터를 갖는 제 1 생성자 셰이더에 할당할 수도 있다. GPU 는 생성자 셰이더 카운트 버퍼 내의 제 2 저장 위치를 제 1 생성자 셰이더 이후에 그리고 다른 생성자 셰이더들로부터의 그래픽 데이터가 소비되기 전에 소비되어야 하는 그래픽 데이터를 갖는 제 2 생성자 셰이더에 할당하는 등을 할 수도 있다.
이 방식으로, GPU 는, 그래픽 데이터가 소비될 준비가 되기 전에 소비자 셰이더들을 실행시키는 것이 아니라, 그래픽 데이터가 소비될 준비가 될 때 소비자 셰이더들을 실행시킬 수도 있다. 일 예로서, 예시를 목적으로, GPU 가 제 1 생성자 셰이더를 실행시키고, 그 후의 어느 시간에 제 2 생성자 셰이더를 실행시킨다는 것을 상정한다. 이 예에서, 제 1 생성자 셰이더는 카운트 버퍼 내의 제 1 저장 위치에 할당되고, 제 2 생성자 셰이더는 카운트 버퍼 내의 제 2 저장 위치에 할당된다. 또한, 제 1 생성자 셰이더로부터의 그래픽 데이터가 제 2 생성자 셰이더로부터의 그래픽 데이터에 앞서 소비되어야 한다는 것을 상정한다.
이 예에서, 제 2 생성자 셰이더는 제 1 생성자 셰이더에 앞서 그래픽 데이터의 생성을 완료했다. 따라서, 생성자 셰이더 카운트 버퍼 내의 제 2 저장 위치는 생성자 셰이더 카운트 버퍼 내의 제 1 저장 위치에 앞서 값을 저장했다. 예컨대 GPU 가 제 1 및 제 2 생성자 셰이더들을 실행시킨 순서에 기초하여, 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터에 앞서 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터가 소비되어야 한다는 것을 GPU 가 알 수도 있기 때문에, 이 예에서, GPU 는 생성자 셰이더 카운트 버퍼 내의 제 1 저장 위치가 값을 저장할 때까지 소비자 셰이더들을 실행시키지 않고 보류할 수도 있다. 전술된 바와 같이, 생성자 셰이더 카운트 버퍼의 저장 위치 내에서의, 카운트 값, 예컨대 생성된 그래픽 데이터의 양을 나타내는 값의 저장은 그 저장 위치에 할당된 생성자 셰이더가 그래픽 데이터의 생성을 완료했음을 나타낸다.
도 1 은 본 개시물의 하나 이상의 양태들을 구현하도록 동작가능할 수도 있는 그래픽 프로세싱 유닛 (GPU)(10) 의 예를 예시한 블록도이다. GPU (10) 는 디스플레이 상의 픽셀들에 대한 픽셀 값들과 같은 그래픽 데이터를 생성하도록 그래픽 파이프라인을 구현할 수도 있다. 예를 들어, GPU (10) 는, Khronos Group 에 의해 2008 년 4 월 24 일에 발표된 OpenGL ES 2.0 사양에서 설명되고 공개적으로 입수가능한 것과 유사한 그래픽 파이프라인을 구현할 수도 있다. 다른 예로서, 본 개시물의 양태들은 그래픽 파이프라인을 정의하는 Microsoft® DirectX (DX) 10 및 11 애플리케이션 프로그래밍 인터페이스들 (API들) 에서 구현될 수도 있다. 그래픽 파이프라인은 GPU (10) 상에서 실행하는 소프트웨어, GPU (10) 상에서 실행하는 펌웨어, GPU (10) 상에 형성된 하나 이상의 하드웨어 유닛들, 또는 이들의 조합으로서 구현될 수도 있다. GPU (10) 는 다른 그래픽 파이프라인들을 마찬가지로 구현할 수도 있으며, 본 개시물의 양태들은 OpenGL ES 2.0 사양, 또는 DX 10 및 11 API들의 그래픽 파이프라인으로 제한되는 것으로 간주되어서는 안 된다.
GPU (10) 의 예들은 디지털 신호 프로세서 (DSP), 범용 마이크로프로세서, 주문형 반도체 (ASIC), 필드 프로그래밍가능 로직 어레이 (FPGA), 또는 다른 등가의 집적 또는 이산 로직 회로부를 포함하지만 이들로 제한되는 것은 아니다. 도 1 에 예시된 바와 같이, GPU (10) 는 제어기 (12), 기하학적 셰이더 카운트 버퍼 (18), 기하학적 셰이더 버퍼 (20), 및 소비 카운트 버퍼 (22) 를 포함할 수도 있다. 또한, 도 1 에 예시된 바와 같이, GPU (10) 는 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 의 하나 이상의 인스턴스들을 실행시킬 수도 있다.
GPU (10) 는 그래픽 파이프라인을 형성하는 추가의 유닛들 또는 모듈들을 포함할 수도 있다. 그러나, 이러한 추가의 유닛들 또는 모듈들은 명료성을 목적으로 도 1 에는 예시되어 있지 않다. 또한, 기하학적 셰이더 카운트 버퍼 (18), 기하학적 셰이더 버퍼 (20), 및 소비 카운트 버퍼 (22) 가 GPU (10) 내부에 있는 것으로 예시되어 있지만, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 대안의 예들에서, 기하학적 셰이더 카운트 버퍼 (18), 기하학적 셰이더 버퍼 (20), 및 소비 카운트 버퍼 (22) 는 GPU (10) 외부에 있을 수도 있다. 예를 들어, 기하학적 셰이더 버퍼 (20) 에 저장될 그래픽 데이터의 양이 GPU (10) 상에서 이용가능한 저장 공간의 양보다 큰 것이 가능할 수도 있다. 이들 예들에서, 기하학적 셰이더 버퍼 (20) 는 GPU (10) 외부에 있을 수도 있다. 대안으로서, 몇몇 예들에서, 기하학적 셰이더 카운트 버퍼 (18) 및 기하학적 셰이더 버퍼 (20) 가 공통 버퍼의 일부인 것, 예컨대 하나의 버퍼가 기하학적 셰이더 카운트 버퍼 (18) 및 기하학적 셰이더 버퍼 (20) 양측 모두를 포함하는 것이 가능할 수도 있다. 또한, 소비 카운터 버퍼 (22) 는, 추가의 동기화 보조를 제어기 (12) 에 잠재적으로 제공할 수도 있지만, 후술되는 바와 같이, GPU (10) 의 모든 예에서 필수적인 것은 아닐 수도 있다.
GPU (10) 의 제어기 (12) 는 GPU (10) 상에서 실행하는 소프트웨어 유닛 또는 하드웨어 유닛일 수도 있다. 예시를 목적으로, 제어기 (12) 는 하드웨어 유닛인 맥락에서 설명된다. 제어기 (12) 는 GPU (10) 가 하나 이상의 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 을 언제 실행시켜야 하는지를 결정할 수도 있다. 제어기 (12) 는 또한 GPU (10) 가 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 의 인스턴스화를 얼마나 많이 실행해야 하는지를 결정할 수도 있다.
버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 은 GPU (10) 상에서 실행하는 소프트웨어 유닛일 수도 있다. 예시를 목적으로, 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 은 GPU (10) 내에 상주하는 것으로 예시된다. 그러나, 이것은 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 이 GPU (10) 에 의해 실행되는 것을 예시하기 위한 것이다. 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 에 대한 명령들은 GPU (10) 외부에 있는 저장 디바이스에 저장될 수도 있다. 예를 들어, 버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 에 대한 컴파일된 오브젝트 코드 또는 소스 코드는 GPU (10) 외부에 있는 저장 디바이스에 저장될 수도 있다.
버텍스 셰이더들 (14), 기하학적 셰이더들 (16), 및 픽셀 셰이더들 (24) 은, 본 개시물에서 설명되는 바와 같이, GPU (10) 에 의해 실행되는 기능적 유닛들의 형태를 일반적으로 취할 수도 있다는 것을 이해해야 한다. 이러한 기능적 유닛들은 셰이더들의 특정 기능적 양태들을 강조하기 위해 개별적으로 설명되며, 이러한 양태들이 개별적으로 구조화, 배열, 또는 코딩되어야 한다는 것을 반드시 내포하는 것은 아니다. 따라서, 이러한 기능적 양태들은 통합적으로 또는 개별적으로 형성되어 하나의 GPU 또는 다수의 GPU들 상에서 또는 다수의 GPU 코어들 상에서 실행될 수도 있으며, 설명은 그러한 기능적 양태들의 구현에 대해 제한사항으로 간주되어서는 안 된다.
몇몇 예들에서, 제어기 (12) 는 디스플레이 상에 디스플레이될 이미지의 속성들을 수신할 수도 있다. 예를 들어, GPU (10) 외부의 프로세서 (미도시) 는 디스플레이 상에 디스플레이될 이미지를 생성할 수도 있다. 프로세서는, 일 예로서, 삼각형들과 같은 다각형들일 수도 있는 하나 이상의 프리미티브들로 이미지를 분할할 수도 있다. 프로세서는 다각형들의 버텍스들 각각의 버텍스 속성들을 결정할 수도 있다. 예를 들어, 프로세서는 버텍스들 각각의 버텍스 좌표들 및 컬러 값들, 예컨대 적색-녹색-청색 (RGB) 컬러 값들 또는 루마 및 크로마 값들을 결정할 수도 있다. 프로세서는 버텍스들 각각의 버텍스 속성들을 GPU (10) 의 제어기 (12) 에 송신할 수도 있다.
제어기 (12) 는, 예를 들어 프로세서로부터 수신된 속성들에 기초하여, 버텍스 셰이더들 (14) 의 인스턴스화들이 GPU (10) 에 의해 얼마나 많이 실행되어야 하는지를 결정할 수도 있다. 예를 들어, 도 1 에 예시된 바와 같이, GPU (10) 는 버텍스 셰이더들 (14A-14N) 을 실행시킬 수도 있다. 이들 버텍스 셰이더들 (14A-14N) 의 각각은 유사한 기능들을 수행할 수도 있지만, 그래픽 데이터의 상이한 세트들 상에서 수행할 수도 있다. 예를 들어, GPU (10) 외부의 저장 디바이스가 버텍스 셰이더에 대한 명령들을 저장할 수도 있다. GPU (10) 는, 제어기 (12) 에 의해 결정된 바와 같이, 버텍스 셰이더들 (14A-14N) 로서 나타내지는 버텍스 셰이더의 명령들의 다수의 인스턴스들을 실행시킬 수도 있다.
몇몇 예들에서, 제어기 (12) 는 GPU (10) 로 하여금 각각의 프리미티브에 대해 버텍스 셰이더들 (14) 중 하나를 실행시키게 할 수도 있다. 예를 들어, 제어기 (12) 는 GPU (10) 로 하여금 버텍스 셰이더 (14A) 를 실행시켜 제 1 프리미티브를 프로세싱하게 할 수도 있고, GPU (10) 로 하여금 버텍스 셰이더 (14B) 를 실행시켜 제 2 프리미티브를 프로세싱하게 하는 등을 할 수도 있다. 이 방식으로, GPU (10) 는 버텍스 셰이더들 (14) 의 다수의 인스턴스들을 병렬로 실행시킬 수도 있다. 그러나, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 제어기 (12) 는 반드시 GPU (10) 로 하여금 각각의 프리미티브에 대해 버텍스 셰이더들 (14) 중 하나를 실행시키게 하는 것은 아닐 수도 있다.
버텍스 셰이더들 (14) 은, 실행 시, 다각형들의 버텍스들의 수신된 좌표들을 디스플레이의 좌표들로 변환할 수도 있고, 버텍스들에 대한 라이트 값들을 결정할 수도 있다. 예를 들어, 버텍스 셰이더들 (14) 은 수신된 다각형들을 회전시키고 스케일링하여 프리미티브들을 생성할 수도 있다. 버텍스 셰이더들 (14) 의 출력은 프리미티브들의 버텍스들의 속성들일 수도 있다. 버텍스 셰이더들 (14) 은 버텍스 셰이더들 (14) 에 의해 결정된 바와 같은 버텍스들의 속성들을 기하학적 셰이더들 (16) 에 송신할 수도 있다.
버텍스 셰이더들 (14) 과 마찬가지로, GPU (10) 외부의 저장 디바이스는 기하학적 셰이더에 대한 명령들을 저장할 수도 있다. 제어기 (12) 는, 예를 들어 버텍스 셰이더들 (14) 에 의해 생성된 프리미티브들의 수에 기초하여, GPU (10) 가 기하학적 셰이더들 (16A-16M) 로서 나타내지는 기하학적 셰이더들 (16) 의 인스턴스화를 얼마나 많이 실행시켜야 하는지를 결정할 수도 있다. 몇몇 예들에서, GPU (10) 가 실행시켜야 하는 기하학적 셰이더들 (16) 의 수는 GPU (10) 가 실행시킨 버텍스 셰이더들 (14) 의 수와 동일할 수도 있다. 그러나, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 기하학적 셰이더들 (16A-16M) 은 유사한 기능들을 수행할 수도 있지만, 상이한 데이터에 대해 수행할 수도 있다.
기하학적 셰이더들 (16) 의 각각은 버텍스 셰이더들 (14) 중의 하나로부터 단일 프리미티브에 대한 버텍스들의 버텍스 속성들을 수신할 수도 있다. 몇몇 예들에서, 기하학적 셰이더들 (16) 은 단일 프리미티브를 하나 이상의 프리미티브들로 더 분할할 수도 있다. 예를 들어, 기하학적 셰이더 (16A) 는 단일 삼각형의 버텍스들을 수신할 수도 있으며, 단일 삼각형을 분할하여 5 개의 삼각형들을 생성할 수도 있다. 기하학적 셰이더들 (16) 은 또한 기하학적 셰이더들 (16) 에 의해 생성된 프리미티브들의 버텍스들 각각에 대한 속성들, 예컨대 컬러 및 좌표들을 결정할 수도 있다. 버텍스들 및 이들의 대응하는 속성들을 포함하는, 기하학적 셰이더들 (16) 에 의해 생성된 프리미티브들은 기하학적 셰이더들 (16) 에 의해 생성된 그래픽 데이터로 지칭될 수도 있다.
몇몇 예들에서, 기하학적 셰이더들 (16) 의 각각이 생성할 수도 있는 프리미티브들의 수는 알려져 있지 않을 수도 있다. 또한, 기하학적 셰이더들 (16) 의 각각이 프리미티브들의 생성을 언제 끝낼지가 알려져 있지 않을 수도 있다. 예를 들어, 제어기 (12) 는 GPU (10) 가 2 개의 기하학적 셰이더들 (16), 예컨대 기하학적 셰이더 (16A) 및 기하학적 셰이더 (16B) 를 실행시켜야 함을 결정할 수도 있고, GPU (10) 로 하여금 기하학적 셰이더 (16A) 및 기하학적 셰이더 (16B) 를 실행시키게 할 수도 있다. 이 예에서, 제어기 (12) 는 기하학적 셰이더 (16A) 가 프리미티브들을 얼마나 많이 생성할 것인지 그리고 기하학적 셰이더 (16B) 가 프리미티브들을 얼마나 많이 생성할 것인지를 알지 못할 수도 있다.
제어기 (12) 는 기하학적 셰이더들 (16) 의 프로그래밍에 기초하여 프리미티브를 나타내는 데 얼마나 많은 바이트들이 사용되는지를 알 수도 있다. 예를 들어, 기하학적 셰이더들 (16) 에 의해 생성된 프리미티브들 각각은 100 바이트들에 의해 나타내질 수도 있는데, 예컨대 100 바이트들은 기하학적 셰이더들 (16) 중 하나에 의해 생성된 프리미티브의 버텍스들 및 속성들을 나타낸다. 그러나, 기하학적 셰이더들 (16) 이 프리미티브들을 얼마나 많이 생성할 수도 있는지를 제어기 (12) 가 알지 못할 수도 있기 때문에, 제어기 (12) 는 기하학적 셰이더들 (16) 이 얼마나 많은 총 바이트들을 생성할 수도 있는지를 알지 못할 수도 있다.
또한, 제어기 (12) 는 기하학적 셰이더들 (16) 의 각각이 프리미티브들의 생성을 언제 완료할 것인지를 알지 못할 수도 있다. 예를 들어, 제어기 (12) 는 GPU (10) 로 하여금 먼저 기하학적 셰이더 (16A) 를 실행시키게 하고 그 다음에 기하학적 셰이더 (16B) 를 실행시키게 할 수도 있다. 이 예에서, 기하학적 셰이더 (16A) 가 그의 프리미티브들의 생성을 완료하기 전에 기하학적 셰이더 (16B) 가 그의 프리미티브들의 생성을 완료하는 것이 가능할 수도 있다.
이들 불확실성들, 예컨대 기하학적 셰이더들 (16) 이 생성할 그래픽 데이터의 양 및 기하학적 셰이더들 (16) 이 그래픽 데이터의 생성을 완료할 시기는, 제어기 (12) 가 하나 이상의 픽셀 셰이더들 (24) 을 언제 실행시킬 것인지 결정하는 것을 어렵게 만들 수도 있다. 픽셀 셰이더들 (24) 은 기하학적 셰이더들 (16) 에 의해 생성된 그래픽 데이터, 예컨대 프리미티브들 및 대응하는 속성들을 소비할 수도 있다. 따라서, 기하학적 셰이더들 (16) 중 하나 이상은 "생성자" 셰이더들의 예들일 수도 있고, 하나 이상의 픽셀 셰이더들 (14) 은 "소비자" 셰이더들의 예들일 수도 있다.
다시 말해, 하나 이상의 생성자 셰이더들은 하나 이상의 소비자 셰이더들에 의해 소비되는 그래픽 데이터를 생성할 수도 있다. 생성자 셰이더들의 비제한적인 일 예는 기하학적 셰이더들 (16) 이고, 소비자 셰이더들의 비제한적인 일 예는 픽셀 셰이더들 (24) 이다. 본 개시물에서 설명되는 예들이 기하학적 셰이더들 (16) 을 생성자 셰이더들인 것으로 그리고 픽셀 셰이더들 (24) 을 소비자 셰이더들인 것으로 설명하고 있지만, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 일반적으로, 본 개시물에서 설명되는 예시적인 기법들은 가변량의 그래픽 데이터를 생성하는 임의의 셰이더 및 생성된 가변량의 그래픽 데이터를 소비해야 하는 임의의 셰이더로 확장가능할 수도 있다. 본 개시물에서 설명되는 예시적인 기법들은 생성자 및 소비자 셰이더들의 실행의 동기화가 바람직할 수도 있는 임의의 그래픽 시스템으로 확장가능할 수도 있다.
하나 이상의 픽셀 셰이더들 (24) 의 각각에 의해 소비될 데이터가 이용가능하게 된 후에 GPU (10) 가 하나 이상의 픽셀 셰이더들 (24) 을 실행시키는 것이 유리할 수도 있다. 예를 들어, 제어기 (12) 가 GPU (10) 로 하여금 실행되는 픽셀 셰이더들 (24) 에 의해 소비될 그래픽 데이터가 이용하능하게 되기 전에 하나 이상의 픽셀 셰이더들 (24) 을 실행시키게 했다면, 이들 실행되는 픽셀 셰이더들 (24) 은 소비될 그래픽 데이터가 이용가능할 때까지 아이들 상태, 예컨대 "처리 중 대기 (busy wait)" 상태로 남아 있을 수도 있다. "처리 중 대기" 상태에서, 실행된 픽셀 셰이더들 (24) 은, 소비될 그래픽 데이터를 기다리는 루프에 잔존하고, 그래픽 데이터가 이용가능하게 될 때 "처리 중 대기" 상태를 벗어나며, 그 후, 그래픽 데이터를 소비한다. "대기 중 처리" 상태는 바람직하지 않을 수도 있는데, 이는, 그래픽 데이터를 소비할 때, 실행되는 픽셀 셰이더들 (24) 에 의해 사용될 GPU (10) 의 하드웨어 유닛들, 이를테면 레지스터들 또는 할당된 메모리가, 실행되는 픽셀 셰이더들 (24) 이 소비할 그래픽 데이터를 기다리고 있는 동안에는 다른 태스크들에 대해 이용불가능하기 때문이다.
본 개시물에서 설명되는 예시적인 기법들 중 일부는, 하나 이상의 픽셀 셰이더들 (24) 에 의해 소비될 그래픽 데이터가 이용가능하게 된 후, GPU (10) 가 하나 이상의 픽셀 셰이더들 (24) 을 실행시키도록 제어기 (12) 가 하나 이상의 픽셀 셰이더들 (24) 의 실행을 동기화시키게 할 수도 있다. 도 1 에 예시된 바와 같이, GPU (10) 는 기하학적 셰이더 카운트 버퍼 (18) 를 포함할 수도 있다. 기하학적 셰이더 카운트 버퍼 (18) 는 복수의 저장 위치들을 포함할 수도 있다. 예를 들어, 기하학적 셰이더 카운트 버퍼 (18) 는 GPU (10) 의 레지스터들 또는 로컬 메모리의 부분, 예컨대 내부 캐시일 수도 있다. 몇몇 예들에서, 제어기 (12) 및 GPU (10) 는 외부 시스템 버스를 통한 액세스를 요구하지 않으면서 기하학적 셰이더 카운트 버퍼 (18) 의 콘텐츠에 상대적으로 신속하게 액세스할 수도 있다. 전술된 바와 같이, 몇몇 예들에서, 기하학적 셰이더들 (16) 은 생성자 셰이더들의 예들일 수도 있다. 따라서, 기하학적 셰이더 카운트 버퍼 (18) 는 생성자 셰이더 카운트 버퍼로 지칭될 수도 있다.
제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 의 복수의 저장 위치들 각각을 각각의 실행되는 기하학적 셰이더들 (16) 에 할당할 수도 있다. 예를 들어, 제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 의 제 1 저장 위치를 실행되는 기하학적 셰이더들 (16) 중 하나에 할당할 수도 있고, 기하학적 셰이더 카운트 버퍼 (18) 의 제 2 저장 위치를 실행되는 기하학적 셰이더들 (16) 중 다른 하나에 할당하는 등을 할 수도 있다. 실행되는 기하학적 셰이더들 (16) 의 각각은 그것이 생성한 그래픽 데이터의 양을 나타내는 값을 기하학적 셰이더 카운트 버퍼 (18) 의 그의 할당된 저장 위치 내로 저장할 수도 있다. 일 예로서, 실행되는 기하학적 셰이더들 (16) 중 하나에 의해 생성된 그래픽 데이터의 양을 나타내는 값은 기하학적 셰이더들 (16) 중의 상기 하나에 의해 생성된 프리미티브들의 양의 값일 수도 있다.
몇몇 예들에서, 실행되는 기하학적 셰이더들 (16) 의 각각은 그것이 그래픽 데이터의 생성을 완료한 후에 기하학적 셰이더들 (16) 중의 상기 하나에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다. 예를 들어, 도 1 에 예시된 바와 같이, 기하학적 셰이더들 (16) 은 그들의 생성된 그래픽 데이터를 그것이 생성되고 있는 기하학적 셰이더 버퍼 (20) 로 출력할 수도 있다. 예를 들어, 기하학적 셰이더 (16A) 는 3 개의 프리미티브들을 생성할 수도 있고, 각각의 프리미티브에 대한 그래픽 데이터의 생성을 완료한 후에는 각각의 프리미티브의 그래픽 데이터를 기하학적 셰이더 버퍼 (20) 로 출력할 수도 있다. 그 후, 기하학적 셰이더 (16A) 는, 기하학적 셰이더 (16A) 가 제 3 프리미티브에 대한 그래픽 데이터의 생성을 완료한 후 기하학적 셰이더 (16A) 에 할당된 기하학적 셰이더 카운트 버퍼 (18) 의 저장 위치에 (출력 데이터로서 3 개의 프리미티브들을 지정하는) 3 의 값을 저장할 수도 있다.
몇몇 예들에서, 기하학적 셰이더들 (16) 은 생성된 그래픽 데이터의 양을 나타내는 값을 저장하는 과제를 부여받을 수도 있는데, 이는 기하학적 셰이더들 (16) 이 생성된 그래픽 데이터의 양을 카운트하도록, 예컨대 생성된 프리미티브들의 수를 카운트하도록 동작가능할 수도 있기 때문이다. 이와는 다르게, 제어기 (12) 와 같은 다른 유닛은 기하학적 셰이더들 (16) 에 의해 생성된 프리미티브들의 양을 트래킹하는 데 요구될 수도 있는데, 이는 비효율적일 수도 있고 불필요하게 프로세싱 전력을 소비할 수도 있다.
또한, 전술된 바와 같이, 제어기 (12) 는 기하학적 셰이더들 (16) 이 얼마나 많은 프리미티브들을 생성할 수도 있는지를 알지 못할 수도 있다. 따라서, 몇몇 예들에서, 기하학적 셰이더들 (16) 은 생성된 그래픽 데이터의 양을 나타내는 값을 저장하는 데 매우 적합할 수도 있는데, 이는 그래픽 셰이더들 (16) 이 그래픽 데이터의 생성을 완료했을 때를 그래픽 셰이더들 (16) 이 알 것이기 때문이다.
예를 들어, 이 예에서, 기하학적 셰이더 (16A) 가 제 1 프리미티브 또는 제 2 프리미티브의 그래픽 데이터의 생성을 완료한 후, 기하학적 셰이더 (16) 는 기하학적 셰이더 (16) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 이제 저장하지 않을 수도 있기 때문이다. 오히려, 기하학적 셰이더 (16A) 는 그것이 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장하기 전에 3 개의 모든 프리미티브들에 대한 그래픽 데이터의 생성을 완료할 때까지 기다릴 수도 있다. 따라서, 기하학적 셰이더 카운트 버퍼 (18) 의 저장 위치로의, 생성된 그래픽 데이터의 양을 나타내는 값의 저장은 기하학적 셰이더 카운트 버퍼 (18) 의 그 저장 위치에 할당된 기하학적 셰이더들 (16) 중의 기하학적 셰이더가 그의 그래픽 데이터의 생성을 완료했음을 나타낼 수도 있다.
실행되는 기하학적 셰이더들 (16) 이, 그래픽 데이터의 생성 완료 때까지, 생성된 그래픽 데이터의 양을 나타내는 값을 저장하지 않음을 보장하기 위한 적어도 2 개의 기법들이 있을 수도 있다. 일 예시적인 기법으로서, 기하학적 셰이더들 (16) 은 카운터를 갖도록 설계될 수도 있다. 예를 들어, 기하학적 셰이더들 (16) 에 대한 소스 코드를 기록하는 프로그래머는 카운터를 유지하도록 하는 명령들을 기하학적 셰이더들 (16) 에 대한 소스 코드 내에 포함시킬 수도 있다.
컴파일된 버전의 소스 코드는 기하학적 셰이더들 (16) 에 의해 생성된 그래픽 데이터의 양, 예컨대 생성된 프리미티브들의 수를 나타내도록 각각의 프리미티브의 생성 후에 기하학적 셰이더들 (16) 로 하여금 그들의 카운터 값들을 증분시킬 수도 있다. 소스 코드는 또한 기하학적 셰이더들 (16) 이 그래픽 데이터의 생성을 완료한 후 기하학적 셰이더들 (16) 로 하여금 기하학적 셰이더 카운트 버퍼 (18) 내의 그들의 할당된 저장 위치들로 카운터 값을 출력하게 하는 명령들을 포함할 수도 있다.
그러나, 몇몇 예들에서, 기하학적 셰이더들 (16) 이 카운터를 갖도록 설계되지 않았다는 것, 예컨대 카운터가 기하학적 셰이더들 (16) 의 소스 코드의 일부가 아니라는 것이 가능할 수도 있다. 예를 들어, 레거시 기하학적 셰이더들 (16) 에 대한 소스 코드는 카운터를 갖도록 설계되지 않았을 수도 있다. 이들 경우들에서, 컴파일러는 기하학적 셰이더들 (16) 내에 카운터를 포함시키도록 설계될 수도 있다. 예를 들어, 프로세서 (미도시) 는 GPU (10) 에 의해 실행가능한 오브젝트 코드를 생성하도록 기하학적 셰이더에 대한 소스 코드를 컴파일하는 컴파일러를 실행시키고 있을 수도 있다. 컴파일된 기하학적 셰이더의 인스턴스화들은 기하학적 셰이더들 (16) 일 수도 있다. 컴파일 동안, 컴파일러는 실행되는 기하학적 셰이더들 (16) 이 프리미티브를 생성한 후 증가하는 카운터를 유지시키는 명령들을 기하학적 셰이더의 오브젝트 코드 내에 포함시킬 수도 있다. 컴파일러는 또한 그래픽 데이터의 생성의 완료 후 기하학적 셰이더 카운트 버퍼 (18) 내의 할당된 저장 위치에 카운터 값을 저장하도록 하는 명령들을 기하학적 셰이더의 오브젝트 코드에 포함시킬 수도 있다. 이 방식으로, 실행되는 기하학적 셰이더들 (16) 은, 기하학적 셰이더들 (16) 이 카운터를 갖도록 설계되지 않았다 해도, 예컨대 카운터 값이 기하학적 셰이더들 (16) 에 대한 소스 코드의 일부가 아닌 경우라 해도, 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다.
위 예시적인 기법들 중 어느 하나에 있어서, 컴파일러는 GPU (10) 에 의해 실행가능한 기하학적 셰이더들 (16) 에 대한 오브젝트 코드를 생성하도록 소스 코드를 컴파일할 수도 있다. 제 1 의 예시적인 기법에서, 기하학적 셰이더들 (16) 에 대한 소스 코드는 카운터를 유지시키는 명령들을 이미 포함할 수도 있고, 또한 기하학적 셰이더들 (16) 로 하여금 그래픽 데이터의 생성의 완료 시에 카운터 값을 출력하게 하는 명령들을 포함할 수도 있다. 컴파일러는, 실행가능한 오브젝트 코드를 생성하기 위해, 카운터에 대한 소스 코드 명령들, 및 기하학적 셰이더들 (16) 로 하여금 그래픽 데이터의 생성의 완료 시에 카운터 값을 출력하게 하는 명령들을 컴파일할 수도 있다.
제 2 의 예시적인 기법에서, 기하학적 셰이더들 (16) 에 대한 소스 코드는 카운터를 유지시키는 명령들을 포함하지 않을 수도 있고, 기하학적 셰이더들 (16) 로 하여금 그래픽 데이터의 생성의 완료 시에 카운터 값을 출력하게 하는 명령들을 포함하지 않을 수도 있다. 이 예에서, 컴파일러는 오브젝트 코드로의 애드인 (add-in) 으로서 카운터에 대한 오브젝트 코드 명령들을 그리고 그래픽 셰이더들 (16) 로 하여금 그래픽 데이터의 생성의 완료 시에 카운터 값을 출력하게 하는 오브젝트 코드 명령들을 사전대책으로 포함하도록 설계될 수도 있다. 이 방식으로, 레거시 기하학적 셰이더들 (16) 에 대해서조차, 컴파일러는 기하학적 셰이더들 (16) 로 하여금 카운터를 유지시키고 그래픽 데이터의 생성의 완료 시에 카운터 값을 출력하게 하는, GPU (10) 에 의해 실행가능한, 오브젝트 코드를 생성할 수도 있다.
제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 에 저장된 값들에 기초하여 얼마나 많은 픽셀 셰이더들 (24) 을 실행시킬 것인지를 결정할 수도 있다. 예를 들어, 버텍스 셰이더들 (14) 및 기하학적 셰이더들 (16) 과 유사하게, GPU (10) 외부의 저장 디바이스는 픽셀 셰이더에 대한 명령들, 예컨대 픽셀 셰이더에 대한 오브젝트 또는 소스 코드를 저장할 수도 있다. 제어기 (12) 는 픽셀 셰이더들 (24A-24X) 로서 나타내지는 픽셀 셰이더들 (24) 의 하나 이상의 인스턴스들을 실행시킬 수도 있다. 픽셀 셰이더들 (24) 은 유사한 기능들을 수행할 수도 있지만 상이한 그래픽 데이터 상에서 수행할 수도 있다. 픽셀 셰이더들 (24) 은 기하학적 셰이더들 (16) 에 의해 생성된 프리미티브들을 수신할 수도 있고, 수신된 프리미티브들에 대해 래스터화, 셰이딩, 블렌딩, 일루미네이팅, 및 다른 그래픽 관련 기능들과 같은 하나 이상의 기능들을 수행할 수도 있다. 픽셀 셰이더들 (24) 의 출력은 디스플레이 상에 디스플레이될 픽셀들에 대한 픽셀 값들일 수도 있다.
제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 에 저장된 값들에 기초하여 픽셀 셰이더들 (24) 의 인스턴스화들을 얼마나 많이 실행할 것인지를 결정할 수도 있다. 일 예로서, 제어기 (12) 는 각각의 기하학적 셰이더들 (16) 에 의해 생성된 각각의 프리미티브에 대한 픽셀 셰이더들 (24) 중 하나를 실행시킬 수도 있다. 예를 들어, 기하학적 셰이더 카운트 버퍼 (18) 의 제 1 저장 위치가 5 의 값을 저장했고, 기하학적 셰이더 카운트 버퍼 (18) 의 제 2 저장 위치가 6 의 값을 저장했고, 기하학적 셰이더 카운트 버퍼 (18) 의 제 3 저장 위치가 10 의 값을 저장했고, 기하학적 셰이더 카운트 버퍼 (18) 의 제 4 저장 위치가 1 의 값을 저장했음을 상정한다. 또한, 기하학적 셰이더 카운트 버퍼 (18) 의 제 1 내지 제 4 저장 위치들은 각각 기하학적 셰이더들 (16A-16D) 에 할당됨을 상정한다.
이 예에서, 제어기 (12) 는 기하학적 셰이더 (16A) 에 의해 생성된 5 개의 프리미티브들 중 하나의 프리미티브의 그래픽 데이터를 각각이 소비하는 픽셀 셰이더들 (24) 의 5 개의 인스턴스들을 실행시킬 수도 있다. 그 후, 제어기 (12) 는 기하학적 셰이더 (16B) 에 의해 생성된 6 개의 프리미티브들 중 하나의 프리미티브의 그래픽 데이터를 각각이 소비하는 픽셀 셰이더들 (24) 의 6 개의 인스턴스들을 실행시킬 수도 있고, 그 다음, 기하학적 셰이더 (16C) 에 의해 생성된 10 개의 프리미티브들 중 하나의 프리미티브의 그래픽 데이터를 각각이 소비하는 픽셀 셰이더들 (24) 의 10 개의 인스턴스들을 실행시킬 수도 있고, 그 뒤에, 기하학적 셰이더 (16D) 에 의해 생성된 1 개의 프리미티브의 그래픽 데이터를 소비하는 픽셀 셰이더들 (24) 의 1 개의 인스턴스의 실행이 이어질 수도 있다.
제어기 (12) 는 픽셀 셰이더들 (24) 의 다음 인스턴스들의 실행을 시작하기 전에 픽셀 셰이더들 (24) 의 제 1 인스턴스들의 실행의 완료 때까지 반드시 기다릴 필요는 없다. 예를 들어, 제어기 (12) 는 이전 예에서 픽셀 셰이더들 (24) 의 다음 6 개의 인스턴스들의 실행을 시작하기 전에 픽셀 셰이더들 (24) 의 처음 5 개의 인스턴스들의 실행의 완료 때까지 기다리지 않을 수도 있다. 제어기 (12) 는 픽셀 셰이더들 (24) 의 제 1 인스턴스들을 실행시킬 수도 있고, 몇몇 예들에서, 픽셀 셰이더들 (24) 의 제 1 인스턴스들이 실행 중인 동안, 픽셀 셰이더들 (24) 의 다음 인스턴스들의 실행을 시작할 수도 있다. 다시 말해, GPU (10) 는, 몇몇 예들에서, 픽셀 셰이더들 (24) 의 다수의 인스턴스들을 병렬로 실행시킬 수도 있다.
몇몇 예들에서, 기하학적 셰이더들 (16) 중 하나에 의해 생성된 그래픽 데이터는 기하학적 셰이더들 (16) 중 다른 하나로부터의 그래픽 데이터 전에 소비될 필요가 있을 수도 있다. 예를 들어, 기하학적 셰이더들 (16) 의 2 개의 기하학적 셰이더들은 중첩하는 프리미티브들에 대한 그래픽 데이터를 생성할 수도 있다. 이 예에서, 중첩된 프리미티브에 대한 그래픽 데이터는 픽셀 셰이더들 (24) 이 중첩하는 및 중첩된 프리미티브들의 컬러들을 적절히 블렌딩할 수 있도록, 중첩하는 프리미티브에 대한 그래픽 데이터에 앞서 소비될 필요가 있을 수도 있다. 그러나, 중첩된 프리미티브를 생성한 기하학적 셰이더들 (16) 중의 기하학적 셰이더가 그의 프리미티브들의 생성을 완료하기 전에, 중첩하는 프리미티브를 생성한 기하학적 셰이더들 (16) 중의 기하학적 셰이더가 그의 프리미티브들의 생성을 완료함이 가능할 수도 있다.
기하학적 셰이더들 (16) 에 의해 생성된 그래픽 데이터가 적절한 순서로 소비됨을 보장하기 위해, 기하학적 셰이더 카운트 버퍼 (18) 는 정렬된 카운트 버퍼로서 기능할 수도 있다. 예를 들어, 제어기 (12) 는, 임의의 다른 기하학적 셰이더들 (16) 로부터의 그래픽 데이터가 소비되기 전에 소비되어야 하는 그래픽 데이터를 갖는, 기하학적 셰이더들 (16) 중의 제 1 기하학적 셰이더에 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치, 예컨대 제 1 저장 위치를 할당할 수도 있다. 제어기 (12) 는, 기하학적 셰이더들 (16) 중의 제 1 기하학적 셰이더 다음에 소비되어야 하고 임의의 다른 기하학적 셰이더들 (16) 로부터의 그래픽 데이터가 소비되기 전에 소비되어야 하는 등의 그래픽 데이터를 갖는, 기하학적 셰이더들 (16) 중의 제 2 기하학적 셰이더에 기하학적 셰이더 카운트 버퍼 (18) 내의 다른 저장 위치, 예컨대 제 2 저장 위치를 할당할 수도 있다.
정렬된 카운트 버퍼를 사용하여, 제어기 (12) 는 그래픽 데이터가 소비되어야 하는 순서로 그래픽 데이터를 소비하도록 제어기 (12) 가 픽셀 셰이더들 (24) 을 실행시킴을 보장할 수도 있다. 예를 들어, 제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치들에 저장된 값들을 모니터링할 수도 있다. 제어기 (12) 는 먼저 소비되어야 하는 그래픽 데이터를 갖는 기하학적 셰이더들 (16) 중의 기하학적 셰이더에 할당된 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치가, 생성된 그래픽 데이터를 나타내는 값을 저장할 때까지 하나 이상의 픽셀 셰이더들 (24) 을 실행시키기를 기다릴 수도 있다.
몇몇 경우들에 있어서, 먼저 소비되어야 하는 그래픽 데이터를 갖는 기하학적 셰이더들 (16) 중의 기하학적 셰이더에 할당된 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치가, 생성된 그래픽 데이터의 양을 나타내는 값을 저장하기 전에, 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치가, 생성된 그래픽 데이터의 양을 나타내는 값을 저장하는 것이 가능할 수도 있다. 이들 경우들에 있어서, 제어기 (12) 는 먼저 소비되어야 하는 그래픽 데이터를 갖는 기하학적 셰이더들 (16) 중의 기하학적 셰이더에 할당된 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치가, 생성된 그래픽 데이터를 나타내는 값을 저장한 후까지 하나 이상의 픽셀 셰이더들 (24) 을 실행시키지 않을 수도 있다.
예시적인 예로서, GPU (10) 가 기하학적 셰이더들 (16A, 16B) 을 실행시킴을 상정한다. 또한, 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터는 기하학적 셰이더 (16B) 에 의해 생성된 그래픽 데이터에 앞서 소비되어야 함을 상정한다. 제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 내의 제 1 저장 위치를 기하학적 셰이더 (16A) 에 할당할 수도 있고, 기하학적 셰이더 카운트 버퍼 (18) 내의 제 2 저장 위치를 기하학적 셰이더 (16B) 에 할당할 수도 있다.
이 예시적인 예에서, 기하학적 셰이더 (16B) 는 기하학적 셰이더 (16A) 에 앞서 그래픽 데이터의 생성을 완료했다. 따라서, 기하학적 셰이더 카운트 버퍼 (18) 내의 제 2 저장 위치는 기하학적 셰이더 카운트 버퍼 (18) 내의 제 1 저장 위치가 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장하기 전에 기하학적 셰이더 (16B) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 수도 있다. 기하학적 셰이더 카운트 버퍼 (18) 의 제 2 저장 위치가 값을 저장할 수도 있지만, 제어기 (12) 는 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터가 먼저 소비되어야 하고 기하학적 셰이더 (16A) 가 그래픽 데이터의 생성을 아직 완료하지 않았기 때문에 하나 이상의 픽셀 셰이더들 (24) 을 아직 실행시키지 않을 수도 있다. 제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 내의 제 1 저장 위치가 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 이제 저장해야 하기 때문에 그래픽 데이터의 생성을 아직 완료하지 않았음을 알 수도 있다. 전술된 바와 같이, 기하학적 셰이더 카운트 버퍼 (18) 내의 저장 위치들은 그들의 할당된 기하학적 셰이더들 (16) 이 그래픽 데이터의 생성을 완료한 후 값들을 저장한다.
이 방식으로, 제어기 (12) 는 하나 이상의 픽셀 셰이더들 (24) 및 기하학적 셰이더들 (16) 의 실행을 동기화할 수도 있다. 예를 들어, 본 개시물에서 설명되는 예시적인 기법들 중 일부를 이용하여, 제어기 (12) 는 그래픽 데이터가 소비에 이용가능할 때 GPU (10) 가 하나 이상의 픽셀 셰이더들 (24) 을 실행시킴을 보장할 수도 있다. 또한, 본 개시물에서 설명되는 예시적인 기법들 중 일부를 이용하여, 제어기 (12) 는, 이용가능한 경우에 픽셀 셰이더들 (24) 이 그래픽 데이터를 소비할 뿐 아니라 그래픽 데이터가 소비되어야 하는 순서로 그래픽 데이터를 소비함을 보장할 수도 있다.
소비 카운트 버퍼 (22) 는 하나 이상의 픽셀 셰이더들 (24) 의 실행을 동기화하는 데 있어서 제어기 (12) 를 더 보조할 수도 있다. 기하학적 셰이더 카운트 버퍼 (18) 와 유사하게, 소비 카운트 버퍼 (22) 는 GPU (10) 의 레지스터들 또는 로컬 메모리의 부분, 예컨대 내부 캐시일 수도 있다. 소비 카운트 버퍼 (22) 는 GPU (10) 의 모든 예에서 필수적인 것은 아니다.
소비 카운트 버퍼 (22) 는 카운터들의 카운터 (counter-of-counters) 로서 기능할 수도 있다. 예를 들어, 소비 카운트 버퍼 (22) 는, 몇몇 경우들에 있어서, 이제 소비될 그래픽 데이터를 기하학적 셰이더들 (16) 이 얼마나 많이 생성했는지를 나타내는 값을 저장할 수도 있다. 소비 카운트 버퍼 (22) 의 값은 초기에 제로일 수도 있다. 제어기 (12) 는 기하학적 셰이더들 (16) 중의 기하학적 셰이더가 기하학적 셰이더 카운트 버퍼 (18) 내의 그의 할당된 저장 위치에, 생성된 그래픽 데이터의 양을 나타내는 값을 저장할 때, 소비 카운트 버퍼 (22) 의 값을 증분시킬 수도 있다. 제어기 (12) 는 기하학적 셰이더들 (12) 중의 기하학적 셰이더에 의해 생성된 그래픽 데이터가 소비된 후 소비 카운트 버퍼 (22) 의 값을 감소시킬 수도 있다.
몇몇 예들에서, 제어기 (12) 는, 먼저 소비되어야 하는 그래픽 데이터를 갖는 기하학적 셰이더 (16) 중의 기하학적 셰이더가 기하학적 셰이더 카운트 버퍼 (18) 내의 그의 할당된 저장 위치에, 생성된 그래픽 데이터의 양을 나타내는 값을 저장한 후 소비 카운트 버퍼 (22) 의 값을 증분시킬 수도 있다. 예를 들어, 위의 예시적인 예를 계속 참조하면, 기하학적 셰이더 (16B) 가 기하학적 셰이더 (16A) 에 앞서 기하학적 셰이더 카운트 버퍼 (18) 에 값을 저장하는 경우, 제어기 (12) 는 소비 카운트 버퍼 (22) 의 값을 아직 증분시키지 않을 수도 있다. 그 후, 기하학적 셰이더 (16A) 가 기하학적 셰이더 카운트 버퍼 (18) 에 값을 저장할 때, 제어기 (12) 는 소비 카운트 버퍼 (22) 의 값을 제로로부터 2 로 증분시킬 수도 있다.
제어기 (12) 는 생성된 그래픽 데이터를 나타내는 값들을 저장하는 정렬된 기하학적 셰이더 카운트 버퍼 (18) 의 저장 위치를 결정도록 소비 카운트 버퍼 (22) 에 저장된 값을 모니터링할 수도 있다. 예를 들어, 소비 카운트 버퍼 (22) 가 6 의 값을 저장했다면, 제어기 (12) 는 기하학적 셰이더 카운트 버퍼 (18) 의 처음 6 개의 저장 위치들이 값들을 저장함을 알 수도 있다. 그 후, 제어기 (12) 는 6 개의 기하학적 셰이더들 (16) 에 의해 생성된 그래픽 데이터를 소비하도록 충분한 픽셀 셰이더들 (24) 의 실행을 제어기 (12) 가 이제 시작해야 함을 알 수도 있다.
도 1 에 예시된 바와 같이, 기하학적 셰이더들 (16) 은 기하학적 셰이더 버퍼 (20) 에 그들의 생성된 그래픽 데이터를 출력할 수도 있다. 기하학적 셰이더 버퍼 (20) 는 기하학적 셰이더 (16) 가 생성자 셰이더들의 예들일 수도 있기 때문에 생성자 셰이더 버퍼로 지칭될 수도 있다. 도 1 이 기하학적 셰이더 버퍼 (20) 를 GPU (10) 의 부분인 것으로 예시하고 있지만, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 몇몇 예들에서, 기하학적 셰이더 버퍼 (20) 가 저장해야 하는 그래픽 데이터의 양은 GPU (10) 상에서 이용가능한 저장 공간의 양보다 클 수도 있다. 이들 예들에서, 기하학적 셰이더 버퍼 (20) 는 GPU (10) 외부에 있을 수도 있으며, GPU (10) 가 시스템 버스로 액세스할 수 있는 저장 디바이스에 상주할 수도 있다.
기하학적 셰이더 버퍼 (20) 는 복수의 저장 위치들을 포함할 수도 있다. 저장 위치들의 각각은 실행된 기하학적 셰이더들 (16) 의 각각에 의해 생성된 그래픽 데이터를 저장할 수도 있다. 예를 들어, 제어기 (12) 는 기하학적 셰이더 버퍼 (20) 의 제 1 저장 위치를 기하학적 셰이더 (16A) 에 할당할 수도 있고, 기하학적 셰이더 버퍼 (20) 의 제 2 저장 위치를 기하학적 셰이더 (16B) 에 할당하는 등을 할 수도 있다. 기하학적 셰이더들 (16) 의 각각은 그들이 그래픽 데이터를 생성하고 있을 때 기하학적 셰이더 버퍼 (20) 내의 그들의 할당된 저장 위치에 그들의 생성된 그래픽 데이터를 출력할 수도 있다.
예를 들어, 기하학적 셰이더 (16A) 가 5 개의 프리미티브들을 생성한다면, 기하학적 셰이더 (16A) 는 기하학적 셰이더 (16A) 가 제 1 프리미티브에 대한 그래픽 데이터를 생성한 후 기하학적 셰이더 버퍼 (20) 의 제 1 저장 위치에 제 1 프리미티브에 대한 그래픽 데이터를 출력할 수도 있고, 그 뒤에 기하학적 셰이더 버퍼 (20) 의 제 1 저장 위치에 제 2 프리미티브에 대한 그래픽 데이터를 저장하는 등을 할 수도 있다. 전술된 바와 같이, 기하학적 셰이더 (16A) 는 그것이 그래픽 데이터를 생성하고 있기 때문에 그의 생성된 그래픽 데이터를 기하학적 셰이더 버퍼 (20) 의 제 1 저장 위치에 출력할 수도 있지만, 기하학적 셰이더 (16A) 는 기하학적 셰이더 (16A) 가 모든 5 개의 프리미티브들에 대한 그래픽 데이터의 생성을 완료한 후까지 기하학적 셰이더 카운트 버퍼 (18) 에서의 그의 할당된 저장 위치에, 생성된 데이터의 양을 나타내는 값을 출력하지 않을 수도 있다.
몇몇 예들에서, 각각의 기하학적 셰이더들 (16) 이 그래픽 데이터를 얼마나 많이 생성할 수도 있는지를 제어기 (12) 가 알지 못할 수도 있지만, 제어기 (12) 는 각각의 기하학적 셰이더들 (16) 이 생성할 수도 있는 그래픽 데이터의 최대 양을 미리 알 수도 있다. 예를 들어, 각각의 기하학적 셰이더들 (16) 은 그들이 생성할 수 있는 그래픽 데이터의 총량이 제한되도록 설계될 수도 있다. 기하학적 셰이더 버퍼 (20) 의 저장 위치들의 사이즈, 예컨대 기하학적 셰이더 버퍼 (20) 의 각각의 저장 위치가 저장할 수 있는 그래픽 데이터의 양은, 기하학적 셰이더들 (16) 의 각각이 생성할 수 있는 그래픽 데이터의 최대 양과 동등할 수도 있다.
일 예로서, 기하학적 셰이더들 (16) 의 각각이 생성할 수 있는 그래픽 데이터의 최대 양은 4 킬로바이트 (KB) 일 수도 있지만, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 이 예에서, 기하학적 셰이더 버퍼 (20) 의 저장 위치들의 사이즈는 4 KB 일 수도 있다.
몇몇 예들에서, 기하학적 버퍼 (20) 의 저장 위치들에 저장된 그래픽 데이터는 "밀도가 희박 (sparsely populated)" 할 수도 있다. 예를 들어, 몇몇 예들에서, 각각의 기하학적 셰이더들에 의해 생성된 각각의 프리미티브는 100 바이트들에 의해 나타내질 수도 있다. 기하학적 셰이더들 (16) 중 하나가 5 개의 프리미티브들을 생성하면, 기하학적 셰이더들 (16) 중의 그 하나의 기하학적 셰이더에 할당된 기하학적 버퍼 (20) 의 저장 위치는 500 바이트, 예컨대 5 개의 프리미티브들 * 프리미티브 당 100 바이트를 저장할 수도 있다. 따라서, 이 예에서, 기하학적 셰이더들 (16) 중 하나는, 4 KB 에 이르기까지 저장할 수 있는 기하학적 셰이더 버퍼 (20) 의 저장 위치에 500 바이트를 저장했다. 기하학적 버퍼 (20) 의 저장 위치가, 그것이 저장할 수 있는 데이터의 총량의 1/8, 예컨대 4 KB 를 나눈 500 바이트를 저장할 수 있기 때문에, 기하학적 버퍼 (20) 의 저장 위치 내의 데이터는 이 예에서 밀도가 희박한 것으로 간주될 수도 있다.
픽셀 셰이더들 (24) 의 각각은 기하학적 셰이더 버퍼 (20) 의 저장 위치들에 저장된 그래픽 데이터를 소비할 수도 있다. 예를 들어, 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터가 기하학적 셰이더들 (16) 중의 다른 하나로부터의 그래픽 데이터에 앞서 소비되어야 한다는 것을 상정한다. 또한, 제어기 (12) 가 기하학적 셰이더 (16A) 에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장하는 기하학적 셰이더 카운트 버퍼 (18) 의 제 1 저장 위치를 할당했음을 상정한다. 이 예에서, 기하학적 셰이더 (16A) 가 기하학적 셰이더 카운트 버퍼 (18) 의 제 1 저장 위치에, 생성된 그래픽 데이터의 양을 나타내는 값을 저장한 후, 제어기 (12) 는 GPU (10) 로 하여금 기하학적 셰이더 (16A) 에 할당된 기하학적 셰이더 버퍼 (18) 의 저장 위치로부터의 그래픽 데이터를 소비하는 하나 이상의 픽셀 셰이더들 (24) 을 실행시키게 할 수도 있다.
도 2 는 본 개시물의 하나 이상의 양태들을 구현하도록 동작가능할 수도 있는 디바이스 (26) 의 예를 예시한 블록도이다. 디바이스 (26) 의 예들은, 미디어 플레이어들, 셋톱 박스들, 모바일 전화기들과 같은 무선 핸드셋들, 개인 휴대 정보 단말기들 (PDA들), 데스크톱 컴퓨터들, 랩톱 컴퓨터들, 게이밍 콘솔들, 화상 회의 유닛들, 태블릿 컴퓨팅 디바이스들 등과 같은 비디오 디바이스들을 포함하지만 이들로 제한되지는 않는다. 디바이스 (26) 는 프로세서 (28), 그래픽 프로세싱 유닛 (GPU)(10), 저장 디바이스 (32), 송수신기 모듈 (24), 사용자 인터페이스 (36), 디스플레이 버퍼 (38), 및 디스플레이 (40) 를 포함할 수도 있다. 디바이스 (26) 의 GPU (10) 는, 도 2 에 예시된 바와 같이, 도 1 의 GPU (10) 와 동일하거나 또는 실질적으로 유사할 수도 있다. 따라서, GPU (10) 의 예시적인 기능성은 도 2 의 예에서 더 설명되지 않는다.
프로세서 (28) 및 GPU (10) 가 개별 유닛들로 예시되어 있지만, 본 개시물의 양태들은 이와 같이 제한되지는 않는다. 몇몇 예들에서, 프로세서 (28) 및 GPU (10) 는 공통 집적회로 (IC) 에 형성될 수도 있다. 프로세서 (28) 및 GPU (10) 각각은 단일 프로세서 코어 또는 다수의 프로세서 코어들을 포함할 수도 있다.
디바이스 (26) 는, 명료성을 위해 도 2 에 도시되지 않은 부가적인 모듈들 또는 유닛들을 포함할 수도 있다. 예를 들어, 디바이스 (26) 는 디바이스 (26) 가 모바일 무선 전화인 예들에서 전화 통신을 실시하기 위해 스피커 및 마이크로폰 (도 2 에는 어느 것도 도시되지 않음) 을 포함할 수도 있고, 또는 디바이스 (26) 가 미디어 플레이어인 경우에 스피커를 포함할 수도 있다. 또한, 디바이스 (26) 에 도시된 다양한 모듈들 및 유닛들은 디바이스 (26) 의 모든 예에서 필수적인 것은 아닐 수도 있다. 예를 들어, 사용자 인터페이스 (36) 및 디스플레이 (40) 는 디바이스 (26) 가 데스크톱 컴퓨터, 또는 외부 사용자 인터페이스 또는 디스플레이와 인터페이싱하도록 장착된 다른 디바이스인 예들에서 디바이스 (26) 외부에 있을 수도 있다.
프로세서 (28) 의 예들은, DSP, 범용 마이크로프로세서, ASIC, FPGA, 또는 다른 등가의 집적 또는 이산 로직 회로를 포함하지만 이들로 제한되지는 않는다. 저장 디바이스 (32) 는 하나 이상의 컴퓨터 판독가능 저장 매체들을 포함할 수도 있다. 저장 디바이스 (32) 의 예들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광학 디스크 스토리지, 자기 디스크 스토리지 또는 다른 자기 스토리지 디바이스들, 또는 요구되는 프로그램 코드를 명령들 또는 데이터 구조들의 형태로 이송 또는 저장하기 위해 사용될 수 있으며 컴퓨터 또는 프로세서에 의해 액세스될 수 있는 임의의 다른 매체를 포함하지만, 이들로 제한되지는 않는다. 몇몇 예시적인 구현형태들에서, 저장 디바이스 (32) 는 프로세서 (28) 및/또는 GPU (10) 로 하여금 본 개시물에서의 프로세서 (28) 및 GPU (10) 에 주어진 기능들을 수행하게 하는 명령들을 포함할 수도 있다.
저장 디바이스 (32) 는, 몇몇 예들에서, 비일시적 저장 매체로서 간주될 수도 있다. 용어 "비일시적" 이란 저장 매체가 반송파 또는 전파 신호로 구현되지 않음을 나타낼 수도 있다. 그러나, 용어 "비일시적" 은 저장 디바이스 (32) 가 이동불가능하다는 것을 의미하도록 해석되어서는 안 된다. 일 예로서, 저장 디바이스 (32) 는 디바이스 (26) 로부터 제거될 수도 있고, 다른 디바이스로 이동될 수도 있다. 다른 예로서, 저장 디바이스 (32) 와 실실적으로 유사한 저장 디바이스는 디바이스 (26) 내에 삽입될 수도 있다. 어떤 예들에서, 비일시적 저장 매체는 시간이 경과함에 따라 변할 수 있는 데이터를 (예컨대, RAM 에) 저장할 수도 있다.
사용자 인터페이스 (36) 의 예들은 트랙볼, 마우스, 키보드, 및 다른 타입들의 입력 디바이스들을 포함하지만, 이들로 제한되지는 않는다. 사용자 인터페이스 (36) 는 또한 터치스크린일 수도 있고 디스플레이 (40) 의 일부로서 포함될 수도 있다. 송수신기 모듈 (34) 은, 디바이스 (26) 와 다른 디바이스 또는 네트워크 사이의 무선 또는 유선 통신을 허용하는 회로부를 포함할 수도 있다. 송수신기 모듈 (34) 은 변조기들, 복조기들, 증폭기들 및 유선 또는 무선 통신을 위한 다른 그러한 회로부를 포함할 수도 있다.
도 2 에 예시된 바와 같이, 저장 디바이스 (32) 는 버텍스 셰이더 (14), 기하학적 셰이더 (16), 및 픽셀 셰이더 (24) 에 대한 명령들, 예컨대 소스 코드 및/또는 오브젝트 코드를 저장할 수도 있다. GPU (10) 는, 도 1 에 예시된 바와 같이, 버텍스 셰이더들 (14A-14N), 기하학적 셰이더들 (16A-16M), 및 픽셀 셰이더들 (24A-24X) 의 인스턴스화들에 대한 버텍스 셰이더 (14), 기하학적 셰이더 (16), 및 픽셀 셰이더 (24) 의 명령들의 다중 인스턴스들을 실행시킬 수도 있다.
또한, 몇몇 예들에서, 저장 디바이스 (32) 는 기하학적 셰이더 버퍼 (20) 를 포함할 수도 있다. 전술된 바와 같이, 기하학적 셰이더 버퍼 (20) 는 기하학적 셰이더들 (16A-16M) 중 하나 이상에 의해 생성된 그래픽 데이터를 저장할 수도 있다. 저장 디바이스 (32) 는 기하학적 셰이더 버퍼 (20) 를 포함할 수도 있는데, 이는, 몇몇 예들에서 기하학적 셰이더 버퍼 (20) 에 저장될 그래픽 데이터의 양이 GPU (10) 상에서 이용가능한 저장 공간의 양보다 큰 것이 가능할 수도 있기 때문이다.
저장 디바이스 (32) 는, 몇몇 예들에서, 컴파일러 (30) 에 대한 명령들을 저장할 수도 있다. 그러나, 컴파일러 (30) 에 대한 명령들의 저장은 디바이스 (26) 의 모든 예에서 필수적인 것은 아닐 수도 있다. 컴파일러 (30) 는, 몇몇 예시적인 구현형태들에서, 실행 시, 프로세서 (28) 로 하여금 기하학적 셰이더 (16) 의 명령들 내에 카운터를 포함시키게 하는 명령들을 포함할 수도 있다. 예를 들어, 프로세서 (28) 는, 도 2 에 예시된 바와 같이, 기하학적 셰이더 (16) 를 컴파일하도록, 예컨대 기하학적 셰이더 (16) 에 대한 소스 코드를 수신하고 기하학적 셰이더 (16) 에 대한 오브젝트 코드를 생성하도록, 컴파일러 (30) 의 명령들을 실행시킬 수도 있다. 그 후, 프로세서 (28) 는 컴파일된 기하학적 셰이더 (16) 를 저장 디바이스 (32) 에 저장할 수도 있다. GPU (10) 가 기하학적 셰이더 (16) 의 하나 이상의 인스턴스들, 예컨대 기하학적 셰이더들 (16A-16M) 을 실행시킬 때, 기하학적 셰이더들 (16A-16M) 의 각각은 기하학적 셰이더들 (16A-16M) 의 각각에 의해 생성된 그래픽 데이터의 양을 나타내는 그들의 각각의 카운터들을 증분시킬 수도 있다.
GPU (10) 는, 하나 이상의 픽셀 셰이더들 (24) 을 통해, 디스플레이 (40) 상에 디스플레이될 이미지에 대한 픽셀 값들을 출력할 수도 있다. 몇몇 예들에서, GPU (10) 는 디스플레이 (40) 에 직접적으로 픽셀 값들을 출력할 수도 있다. 몇몇 대안의 예들에서, GPU (10) 는 디스플레이 버퍼 (38) 에 이미지의 픽셀 값들을 출력할 수도 있다. 디스플레이 버퍼 (38) 는 전체 이미지가 렌더링될 때까지 이미지의 픽셀 값들을 일시적으로 저장할 수도 있다. 디스플레이 버퍼 (38) 는 이미지 프레임 버퍼로서 간주될 수도 있다. 그 후, 디스플레이 버퍼 (38) 는 디스플레이 (40) 상에 디스플레이될 렌더링된 이미지를 송신할 수도 있다. 디스플레이 (40) 는 액정 디스플레이 (LCD), 유기 발광 다이오드 디스플레이 (OLED), 음극선관 (CRT) 디스플레이, 플라즈마 디스플레이, 또는 다른 타입의 디스플레이 디바이스를 포함할 수도 있다.
도 3 은 본 개시물의 하나 이상의 양태들에 따른 GPU (10) 의 예시적인 동작을 설명하는 플로우차트이다. 단지 예시를 목적으로, 도 1 및 도 2 를 참조한다.
GPU (10) 는 그래픽 데이터를 생성하는 생성자 셰이더를 실행시킬 수도 있다 (42). 생성자 셰이더의 예들은 하나 이상의 기하학적 셰이더들 (16) 을 포함할 수도 있다. 전술된 바와 같이, 하나 이상의 기하학적 셰이더들은 각각 하나 이상의 버텍스 셰이더들 (14) 로부터 하나의 프리미티브를 수신할 수도 있고, 하나의 프리미티브를 하나 이상의 프리미티브들로 분할할 수도 있다. 생성자 셰이더에 의해 생성된 그래픽 데이터는 생성된 하나 이상의 프리미티브들의 버텍스들의 속성들, 예컨대 생성된 하나 이상의 프리미티브들의 버텍스들에 대한 컬러 및 좌표 값들일 수도 있다.
GPU (10) 는 생성된 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장할 수도 있다 (44). 제 1 버퍼의 저장 위치의 일 예는 생성자 셰이더 버퍼 내의 저장 위치일 수도 있다. 생성자 셰이더 버퍼의 일 예는 기하학적 셰이더 버퍼 (20) 일 수도 있다. 기하학적 셰이더 버퍼 (20) 가 저장 디바이스 (32) 의 일부인 예에서, GPU (10) 는 시스템 버스를 통해 기하학적 셰이더 버퍼 (20) 에 액세스할 수도 있다.
그래픽 데이터의 생성의 완료 시, 생성자 셰이더는 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장할 수도 있다 (46). 제 2 버퍼 내의 저장 위치의 일 예는 생성자 셰이더 카운트 버퍼 내의 저장 위치일 수도 있다. 생성자 셰이더 카운트 버퍼의 일 예는 기하학적 셰이더 카운트 버퍼 (18) 일 수도 있다. 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값의 일 예는 생성자 셰이더에 의해 생성된 프리미티브들의 양일 수도 있다. 몇몇 예들에서, 생성자 셰이더는 생성된 프리미티브들의 수를 저장하는 데 적합할 수도 있는데, 이는 생성자 셰이더가 그래픽 데이터의 생성을 완료했을 때를 알 수도 있기 때문이다. 그러나, 제어기 (12) 와 같은 다른 유닛들은 생성자 셰이더가 그래픽 데이터의 생성을 언제 완료할 것인지를 알지 못할 수도 있다.
생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값의 저장 후, GPU (10) 는 하나 이상의 소비자 셰이더들을 실행시킬 수도 있다 (48). 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값의 저장 후에 하나 이상의 소비자 셰이더들을 실행시킴으로써, 제어기 (12) 는 하나 이상의 소비자 셰이더들에 의해 소비될 그래픽 데이터가 이용가능해지기 전에 그 하나 이상의 소비자 셰이더들이 실행되지 않음을 보장할 수도 있다. 소비자 셰이더들의 예들은 하나 이상의 픽셀 셰이더들 (24) 을 포함한다.
하나 이상의 예들에서, 설명된 기능들은 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현되면, 기능들은 컴퓨터 판독가능 매체 상의 하나 이상의 명령들 또는 코드로서 저장될 수도 있다. 컴퓨터 판독가능 매체들은 컴퓨터 데이터 저장 매체들을 포함할 수도 있다. 데이터 저장 매체들은 본 개시물에서 설명된 기법들의 구현을 위한 명령들, 코드 및/또는 데이터 구조들을 취출하기 위해 하나 이상의 컴퓨터들 또는 하나 이상의 프로세서들에 의해 액세스될 수 있는 임의의 이용가능한 매체들일 수도 있다. 비제한적인 예로서, 이러한 컴퓨터 판독가능 매체들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광학 디스크 스토리지, 자기 디스크 스토리지 또는 다른 자기 스토리지 디바이스들, 플래시 메모리, 또는 요구되는 프로그램 코드를 명령들 또는 데이터 구조들의 형태로 이송 또는 저장하기 위해 사용될 수 있으며 컴퓨터에 의해 액세스될 수 있는 임의의 다른 매체를 포함할 수 있다. 본원에서 사용된 디스크 (disk) 와 디스크 (disc) 는 컴팩트 디스크 (CD), 레이저 디스크, 광학 디스크, 디지털 다기능 디스크 (DVD), 플로피 디스크 및 블루레이 디스크를 포함하며, 디스크 (disk) 들은 데이터를 자기적으로 주로 재생하고, 디스크 (disc) 들은 데이터를 주로 레이저를 통해 재생한다. 위의 조합들도 컴퓨터 판독가능 매체들의 범주 내에 포함되어야 한다.
코드는 하나 이상의 디지털 신호 프로세서 (digital signal processor; DSP) 들, 범용 마이크로프로세서들, ASIC (application specification integrated circuit), FPGA들 (field programmable gate arrays), 또는 임의의 다른 등가의 통합 또는 이산 논리 회로부에 의해 실행될 수도 있다. 따라서, 본 명세서에서 사용된 용어 "프로세서" 는 전술된 구조 또는 본 명세서에서 설명된 기법들의 구현에 적합한 임의의 다른 구조 중 임의의 것을 지칭할 수도 있다. 또한, 그 기법들은 하나 이상의 회로들 또는 로직 엘리먼트들로 완전히 구현될 수 있다.
본 개시물의 기법들은 무선 헤드셋, 집적 회로(IC) 또는 IC들의 세트 (즉, 칩 세트) 를 포함하는 다양한 디바이스들 또는 장치들에서 구현될 수도 있다. 개시된 기법들을 수행하도록 구성된 디바이스들의 기능적 양태들을 강조하기 위해 다양한 콤포넌트들, 모듈들, 또는 유닛들이 본 개시물에서 설명되지만, 반드시 상이한 하드웨어 유닛들에 의한 실현을 요구하는 것은 아니다. 대신, 전술된 바와 같이, 다양한 유닛들은, 적절한 소프트웨어 및/또는 펌웨어와 연계하여, 코덱 하드웨어 유닛에 통합되거나 또는 전술된 하나 이상의 프로세서들을 포함하여 상호 동작적인 하드웨어 유닛들의 집합에 의해 제공될 수도 있다.
다양한 실시형태들을 설명하였다. 이들 및 다른 실시형태들은 하기 청구범위의 범주 내에 있다.

Claims (41)

  1. 그래픽 프로세싱 유닛 (GPU) 을 사용하여, 그래픽 데이터를 생성하는 생성자 셰이더 (producer shader) 를 실행시키는 단계;
    상기 GPU 를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하는 단계; 및
    상기 그래픽 데이터의 생성의 완료 시, 상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하는 단계를 포함하는, 방법
  2. 제 1 항에 있어서,
    상기 제 1 및 제 2 버퍼는 공통 버퍼의 일부인, 방법.
  3. 제 1 항에 있어서,
    상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 상기 값을 상기 제 2 버퍼의 저장 위치에 저장한 후, 상기 제 1 버퍼의 저장 위치에 저장된 상기 그래픽 데이터를 소비하기 위해 하나 이상의 소비자 셰이더들을 실행시키는 단계를 더 포함하는, 방법.
  4. 제 1 항에 있어서,
    상기 생성자 셰이더는 제 1 생성자 셰이더를 포함하고, 상기 그래픽 데이터는 제 1 그래픽 데이터를 포함하고, 상기 제 2 버퍼는 제 1 저장 위치 및 제 2 저장 위치를 포함하고, 상기 값은 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장되고,
    상기 방법은,
    제 2 그래픽 데이터를 생성하는 제 2 생성자 셰이더를 실행시키는 단계;
    상기 제 2 생성자 셰이더에 의해 생성된 상기 제 2 그래픽 데이터를 상기 제 1 버퍼의 다른 상이한 저장 위치에 저장하는 단계; 및
    상기 제 2 그래픽 데이터의 생성의 완료 시, 상기 제 2 생성자 셰이더를 사용하여, 상기 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 2 저장 위치에 저장하는 단계를 더 포함하는, 방법.
  5. 제 4 항에 있어서,
    상기 제 2 생성자 셰이더는 상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료하기 전에 상기 제 2 그래픽 데이터의 생성을 완료하고,
    상기 방법은,
    상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료할 때까지 그리고 상기 제 1 생성자 셰이더가 상기 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장할 때까지, 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 상기 제 2 그래픽 데이터를 소비할 하나 이상의 소비자 셰이더들을 실행시키지 않는 단계를 더 포함하는, 방법.
  6. 제 5 항에 있어서,
    상기 제 1 생성자 셰이더가 상기 제 1 버퍼의 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후, 상기 제 1 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 1 소비자 셰이더를 실행시키는 단계; 및
    상기 제 1 소비자 셰이더의 실행 후, 상기 제 2 생성자 셰이더가 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후에 상기 제 2 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 2 소비자 셰이더를 실행시키는 단계를 더 포함하는, 방법.
  7. 제 1 항에 있어서,
    컴파일러를 사용하여, 상기 생성자 셰이더로 하여금 카운터를 생성하게 하는 명령들을 상기 컴파일러에 의해 생성된 상기 생성자 셰이더의 오브젝트 코드 내에 포함시키는 단계를 더 포함하고,
    상기 카운터는 상기 생성자 셰이더의 소스 코드의 일부가 아니고,
    상기 카운터는 상기 생성자 셰이더가 상기 그래픽 데이터를 생성하고 있는 동안 상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 카운트하고,
    상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 상기 그래픽 데이터의 양을 나타내는 값을 저장하는 단계는 상기 그래픽 데이터의 생성의 완료 시에 상기 카운터의 값을 저장하는 단계를 포함하는, 방법.
  8. 제 1 항에 있어서,
    상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 카운트하는 단계를 더 포함하고,
    그래픽 데이터의 양을 나타내는 상기 값은 상기 그래픽 데이터의 생성의 완료 시에 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 포함하는, 방법.
  9. 제 1 항에 있어서,
    상기 생성자 셰이더는 프리미티브를 수신하도록 그리고 상기 프리미티브를 하나 이상의 프리미티브들로 분할하도록 동작가능한 기하학적 셰이더를 포함하고, 상기 소비자 셰이더는 상기 기하학적 셰이더에 의해 생성된 상기 하나 이상의 프리미티브들 중 적어도 하나의 프리미티브를 수신하도록 동작가능한 픽셀 셰이더를 포함하는, 방법.
  10. 제 1 항에 있어서,
    이제 소비될 그래픽 데이터를 갖는 복수의 생성자 셰이더들의 수를 나타내는 값을 저장하는 단계로서, 상기 생성자 셰이더는 상기 복수의 생성자 셰이더들 중의 하나인, 상기 값을 저장하는 단계; 및
    이제 소비될 그래픽 데이터를 갖는 상기 복수의 생성자 셰이더들의 수를 나타내는 저장된 상기 값에 기초하여, 생성된 그래픽 데이터를 나타내는 값들을 상기 제 2 버퍼의 어떤 저장 위치들에 저장할 것인지를 결정하는 단계를 더 포함하는, 방법.
  11. 제 1 버퍼;
    제 2 버퍼; 및
    그래픽 프로세싱 유닛 (GPU) 을 포함하며,
    상기 GPU 는,
    그래픽 데이터를 생성하는 생성자 셰이더를 실행시키고;
    상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터를 상기 제 1 버퍼의 저장 위치에 저장하고;
    상기 그래픽 데이터의 생성의 완료 시, 상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 저장 위치에 저장하도록 동작가능한, 장치.
  12. 제 11 항에 있어서,
    상기 제 1 버퍼 및 상기 제 2 버퍼는 공통 버퍼의 일부인, 장치.
  13. 제 11 항에 있어서,
    상기 GPU 는 상기 제 2 버퍼를 포함하는, 장치.
  14. 제 11 항에 있어서,
    상기 GPU 는 상기 생성자 셰이더가 상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 상기 값을 상기 제 2 버퍼의 저장 위치에 저장한 후 상기 제 1 버퍼의 저장 위치에 저장된 상기 그래픽 데이터를 소비하기 위해 하나 이상의 소비자 셰이더들을 실행시키도록 추가로 동작가능한, 장치.
  15. 제 11 항에 있어서,
    상기 생성자 셰이더는 제 1 생성자 셰이더를 포함하고, 상기 그래픽 데이터는 제 1 그래픽 데이터를 포함하고, 상기 제 2 버퍼는 제 1 저장 위치 및 제 2 저장 위치를 포함하고, 상기 값은 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장되고,
    상기 GPU 는,
    제 2 그래픽 데이터를 생성하는 제 2 생성자 셰이더를 실행시키고;
    상기 제 2 생성자 셰이더에 의해 생성된 상기 제 2 그래픽 데이터를 상기 제 1 버퍼의 다른 상이한 저장 위치에 저장하고;
    상기 제 2 그래픽 데이터의 생성의 완료 시, 상기 제 2 생성자 셰이더를 사용하여, 상기 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 2 저장 위치에 저장하도록 추가로 동작가능한, 장치.
  16. 제 15 항에 있어서,
    상기 제 2 생성자 셰이더는 상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료하기 전에 상기 제 2 그래픽 데이터의 생성을 완료하고,
    상기 GPU 는,
    상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료할 때까지 그리고 상기 제 1 생성자 셰이더가 상기 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장할 때까지, 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 상기 제 2 그래픽 데이터를 소비할 하나 이상의 소비자 셰이더들을 실행시키지 않도록 추가로 동작가능한, 장치.
  17. 제 16 항에 있어서,
    상기 GPU는,
    상기 제 1 생성자 셰이더가 상기 제 1 버퍼의 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후, 상기 제 1 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 1 소비자 셰이더를 실행시키고;
    상기 제 1 소비자 셰이더의 실행 후, 상기 제 2 생성자 셰이더가 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후에 상기 제 2 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 2 소비자 셰이더를 실행시키도록 추가로 동작가능한, 장치.
  18. 제 11 항에 있어서,
    컴파일러를 실행시키고, 상기 생성자 셰이더를 컴파일하여 상기 생성자 셰이더로 하여금 카운터를 생성하게 하는 명령들을 상기 컴파일러에 의해 생성된 상기 생성자 셰이더의 오브젝트 코드 내에 포함시키도록 동작가능한 프로세서를 더 포함하고,
    상기 카운터는 상기 생성자 셰이더의 소스 코드의 일부가 아니고,
    상기 카운터는 상기 생성자 셰이더가 상기 그래픽 데이터를 생성하고 있는 동안 상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 카운트하고,
    상기 생성자 셰이더는 상기 그래픽 데이터의 생성의 완료 시에 상기 카운터의 값을 저장하여 상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 저장하는, 장치.
  19. 제 11 항에 있어서,
    상기 생성자 셰이더는 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 카운트하고,
    그래픽 데이터의 양을 나타내는 상기 값은 상기 그래픽 데이터의 생성의 완료 시에 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 포함하는, 장치.
  20. 제 11 항에 있어서,
    상기 생성자 셰이더는 프리미티브를 수신하도록 그리고 상기 프리미티브를 하나 이상의 프리미티브들로 분할하도록 동작가능한 기하학적 셰이더를 포함하고, 상기 소비자 셰이더는 상기 기하학적 셰이더에 의해 생성된 상기 하나 이상의 프리미티브들 중 적어도 하나의 프리미티브를 수신하도록 동작가능한 픽셀 셰이더를 포함하는, 장치.
  21. 제 11 항에 있어서,
    이제 소비될 그래픽 데이터를 갖는 복수의 생성자 셰이더들의 수를 나타내는 값을 저장하도록 동작가능한 제 3 버퍼로서, 상기 생성자 셰이더는 상기 복수의 생성자 셰이더들 중의 하나인, 상기 제 3 버퍼; 및
    이제 소비될 그래픽 데이터를 갖는 상기 복수의 생성자 셰이더들의 수를 나타내는 저장된 상기 값에 기초하여, 생성된 그래픽 데이터를 나타내는 값들을 상기 제 2 버퍼의 어떤 저장 위치들에 저장할 것인지를 결정하도록 동작가능한 제어기를 더 포함하는, 장치.
  22. 제 11 항에 있어서,
    상기 장치는 미디어 플레이어, 셋톱 박스, 무선 핸드셋, 개인 휴대 정보 단말기 (PDA), 데스크톱 컴퓨터, 랩톱 컴퓨터, 게이밍 콘솔, 화상 회의 유닛, 및 태블릿 컴퓨팅 디바이스 중 적어도 하나를 포함하는, 장치.
  23. 제 1 버퍼;
    제 2 버퍼; 및
    그래픽 프로세싱 유닛 (GPU) 을 포함하며,
    상기 그래픽 프로세싱 유닛 (GPU) 은,
    그래픽 데이터를 생성하는 생성자 셰이더를 실행시키는 수단;
    상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터를 상기 제 1 버퍼의 저장 위치에 저장하는 수단; 및
    상기 그래픽 데이터의 생성의 완료 시, 상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 저장 위치에 저장하는 수단을 포함하는, 장치.
  24. 제 23 항에 있어서,
    상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 상기 값을 상기 제 2 버퍼의 저장 위치에 저장한 후, 상기 제 1 버퍼의 저장 위치에 저장된 상기 그래픽 데이터를 소비하기 위해 하나 이상의 소비자 셰이더들을 실행시키는 수단을 더 포함하는, 장치.
  25. 제 23 항에 있어서,
    상기 생성자 셰이더는 제 1 생성자 셰이더를 포함하고, 상기 그래픽 데이터는 제 1 그래픽 데이터를 포함하고, 상기 제 2 버퍼는 제 1 저장 위치 및 제 2 저장 위치를 포함하고, 상기 값은 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장되고,
    상기 GPU 는,
    제 2 그래픽 데이터를 생성하는 제 2 생성자 셰이더를 실행시키는 수단;
    상기 제 2 생성자 셰이더에 의해 생성된 상기 제 2 그래픽 데이터를 상기 제 1 버퍼의 다른 상이한 저장 위치에 저장하는 수단; 및
    상기 제 2 그래픽 데이터의 생성의 완료 시, 상기 제 2 생성자 셰이더를 사용하여, 상기 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 2 저장 위치에 저장하는 수단을 더 포함하는, 장치.
  26. 제 25 항에 있어서,
    상기 제 2 생성자 셰이더는 상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료하기 전에 상기 제 2 그래픽 데이터의 생성을 완료하고,
    상기 GPU 는,
    상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료할 때까지 그리고 상기 제 1 생성자 셰이더가 상기 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장할 때까지, 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 상기 제 2 그래픽 데이터를 소비할 하나 이상의 소비자 셰이더들을 실행시키지 않는 수단을 더 포함하는, 장치.
  27. 제 26 항에 있어서,
    상기 제 1 생성자 셰이더가 상기 제 1 버퍼의 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후, 상기 제 1 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 1 소비자 셰이더를 실행시키는 수단; 및
    상기 제 1 소비자 셰이더의 실행 후, 상기 제 2 생성자 셰이더가 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후에 상기 제 2 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 2 소비자 셰이더를 실행시키는 수단을 더 포함하는, 장치.
  28. 제 23 항에 있어서,
    상기 생성자 셰이더로 하여금 카운터를 생성하게 하는 명령들을 상기 컴파일러에 의해 생성된 상기 생성자 셰이더의 오브젝트 코드 내에 포함시키도록 동작가능한 컴파일링 수단을 더 포함하고,
    상기 카운터는 상기 생성자 셰이더의 소스 코드의 일부가 아니고,
    상기 카운터는 상기 생성자 셰이더가 그래픽 데이터를 생성하고 있는 동안 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 카운트하고,
    상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 그래픽 데이터의 양을 나타내는 값을 저장하는 수단은 상기 그래픽 데이터의 생성의 완료 시에 상기 카운터의 값을 저장하는 수단을 포함하는, 장치.
  29. 제 23 항에 있어서,
    상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 카운트하는 수단을 더 포함하고,
    그래픽 데이터의 양을 나타내는 상기 값은 상기 그래픽 데이터의 생성의 완료 시에 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 포함하는, 장치.
  30. 제 23 항에 있어서,
    상기 생성자 셰이더는 프리미티브를 수신하도록 그리고 상기 프리미티브를 하나 이상의 프리미티브들로 분할하도록 동작가능한 기하학적 셰이더를 포함하고, 상기 소비자 셰이더는 상기 기하학적 셰이더에 의해 생성된 상기 하나 이상의 프리미티브들 중 적어도 하나의 프리미티브를 수신하도록 동작가능한 픽셀 셰이더를 포함하는, 장치.
  31. 제 23 항에 있어서,
    이제 소비될 그래픽 데이터를 갖는 복수의 생성자 셰이더들의 수를 나타내는 값을 저장하는 수단으로서, 상기 생성자 셰이더는 상기 복수의 생성자 셰이더들 중의 하나인, 상기 값을 저장하는 수단; 및
    이제 소비될 그래픽 데이터를 갖는 상기 복수의 생성자 셰이더들의 수를 나타내는 저장된 상기 값에 기초하여, 생성된 그래픽 데이터를 나타내는 값들을 상기 제 2 버퍼의 어떤 저장 위치들에 저장할 것인지를 결정하는 수단을 더 포함하는, 장치.
  32. 제 23 항에 있어서,
    상기 장치는 미디어 플레이어, 셋톱 박스, 무선 핸드셋, 개인 휴대 정보 단말기 (PDA), 데스크톱 컴퓨터, 랩톱 컴퓨터, 게이밍 콘솔, 화상 회의 유닛, 및 태블릿 컴퓨팅 디바이스 중 적어도 하나를 포함하는, 장치.
  33. 명령들을 포함하는 비일시적 컴퓨터 판독가능 저장 매체로서,
    상기 명령들은 하나 이상의 프로세서들로 하여금,
    그래픽 프로세싱 유닛 (GPU) 을 사용하여, 그래픽 데이터를 생성하는 생성자 셰이더를 실행시키게 하고;
    상기 GPU 를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터를 제 1 버퍼의 저장 위치에 저장하게 하고;
    상기 그래픽 데이터의 생성의 완료 시, 상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 나타내는 값을 제 2 버퍼의 저장 위치에 저장하게 하는, 비일시적 컴퓨터 판독가능 저장 매체.
  34. 제 33 항에 있어서,
    상기 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 저장 위치에 저장한 후 상기 제 1 버퍼의 저장 위치에 저장된 상기 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들을 실행시키게 하는 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  35. 제 33 항에 있어서,
    상기 생성자 셰이더는 제 1 생성자 셰이더를 포함하고, 상기 그래픽 데이터는 제 1 그래픽 데이터를 포함하고, 상기 제 2 버퍼는 제 1 저장 위치 및 제 2 저장 위치를 포함하고, 상기 값은 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장되고,
    상기 명령들은,
    제 2 그래픽 데이터를 생성하는 제 2 생성자 셰이더를 실행시키고;
    상기 제 2 생성자 셰이더에 의해 생성된 상기 제 2 그래픽 데이터를 상기 제 1 버퍼의 다른 상이한 저장 위치에 저장하고;
    상기 제 2 그래픽 데이터의 생성의 완료 시, 상기 제 2 생성자 셰이더를 사용하여, 상기 제 2 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 2 저장 위치에 저장하는 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  36. 제 35 항에 있어서,
    상기 제 2 생성자 셰이더는 상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료하기 전에 상기 제 2 그래픽 데이터의 생성을 완료하고,
    상기 명령들은,
    상기 제 1 생성자 셰이더가 상기 제 1 그래픽 데이터의 생성을 완료할 때까지 그리고 상기 제 1 생성자 셰이더가 상기 제 1 생성자 셰이더에 의해 생성된 그래픽 데이터의 양을 나타내는 값을 상기 제 2 버퍼의 상기 제 1 저장 위치에 저장할 때까지, 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 상기 제 2 그래픽 데이터를 소비할 하나 이상의 소비자 셰이더들을 실행시키지 않는 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  37. 제 36 항에 있어서,
    상기 제 1 생성자 셰이더가 상기 제 1 버퍼의 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후, 상기 제 1 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 1 소비자 셰이더를 실행시키고;
    상기 제 1 소비자 셰이더의 실행 후, 상기 제 2 생성자 셰이더가 상기 제 1 버퍼의 상기 다른 상이한 저장 위치에 저장된 그래픽 데이터의 양을 나타내는 값을 저장한 후에 상기 제 2 그래픽 데이터를 소비하기 위해 상기 하나 이상의 소비자 셰이더들 중의 제 2 소비자 셰이더를 실행시키는 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  38. 제 33 항에 있어서,
    컴파일러를 사용하여, 상기 생성자 셰이더로 하여금 카운터를 생성하게 하는 명령들을 상기 컴파일러에 의해 생성된 상기 생성자 셰이더의 오브젝트 코드 내에 포함시키는 명령들을 더 포함하고,
    상기 카운터는 상기 생성자 셰이더의 소스 코드의 일부가 아니고,
    상기 카운터는 상기 생성자 셰이더가 그래픽 데이터를 생성하고 있는 동안 상기 생성자 셰이더에 의해 생성된 상기 그래픽 데이터의 양을 카운트하고,
    상기 GPU 상에서 실행하는 상기 생성자 셰이더를 사용하여, 그래픽 데이터의 양을 나타내는 값을 저장하는 명령들은 상기 그래픽 데이터의 생성의 완료 시에 상기 카운터의 값을 저장하는 명령들을 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  39. 제 33 항에 있어서,
    상기 생성자 셰이더를 사용하여, 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 카운트하는 명령들을 더 포함하고,
    상기 그래픽 데이터의 양을 나타내는 값은 상기 그래픽 데이터의 생성의 완료 시에 상기 생성자 셰이더에 의해 생성된 프리미티브들의 양을 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  40. 제 33 항에 있어서,
    상기 생성자 셰이더는 프리미티브를 수신하도록 그리고 상기 프리미티브를 하나 이상의 프리미티브들로 분할하도록 동작가능한 기하학적 셰이더를 포함하고, 상기 소비자 셰이더는 상기 기하학적 셰이더에 의해 생성된 상기 하나 이상의 프리미티브들 중 적어도 하나의 프리미티브를 수신하도록 동작가능한 픽셀 셰이더를 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
  41. 제 33 항에 있어서,
    이제 소비될 그래픽 데이터를 갖는 복수의 생성자 셰이더들의 수를 나타내는 값을 저장하고, 상기 생성자 셰이더는 상기 복수의 생성자 셰이더들 중의 하나이고;
    이제 소비될 그래픽 데이터를 갖는 상기 복수의 생성자 셰이더들의 수를 나타내는 저장된 상기 값에 기초하여, 생성된 그래픽 데이터를 나타내는 값들을 상기 제 2 버퍼의 어떤 저장 위치들에 저장할 것인지를 결정하는 명령들을 더 포함하는, 비일시적 컴퓨터 판독가능 저장 매체.
KR1020147004184A 2011-07-19 2012-06-25 셰이더 동작의 동기화 KR101630996B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/186,236 US9442780B2 (en) 2011-07-19 2011-07-19 Synchronization of shader operation
US13/186,236 2011-07-19
PCT/US2012/044008 WO2013012524A1 (en) 2011-07-19 2012-06-25 Synchronization of shader operation

Publications (2)

Publication Number Publication Date
KR20140039076A true KR20140039076A (ko) 2014-03-31
KR101630996B1 KR101630996B1 (ko) 2016-06-15

Family

ID=46548804

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020147004184A KR101630996B1 (ko) 2011-07-19 2012-06-25 셰이더 동작의 동기화

Country Status (6)

Country Link
US (1) US9442780B2 (ko)
EP (1) EP2734923B1 (ko)
JP (1) JP5770375B2 (ko)
KR (1) KR101630996B1 (ko)
CN (1) CN103649922B (ko)
WO (1) WO2013012524A1 (ko)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20160001644A (ko) * 2014-06-27 2016-01-06 삼성전자주식회사 동적 최적화 지연 렌더링 파이프라인
WO2022211926A1 (en) * 2021-03-30 2022-10-06 Advanced Micro Devices, Inc. Wave throttling based on a parameter buffer
US11508124B2 (en) 2020-12-15 2022-11-22 Advanced Micro Devices, Inc. Throttling hull shaders based on tessellation factors in a graphics pipeline
US11776085B2 (en) 2020-12-16 2023-10-03 Advanced Micro Devices, Inc. Throttling shaders based on resource usage in a graphics pipeline

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9269179B2 (en) * 2013-03-15 2016-02-23 Nvidia Corporation System, method, and computer program product for generating primitive specific attributes
US9633408B2 (en) 2013-06-14 2017-04-25 Microsoft Technology Licensing, Llc Coalescing graphics operations
US9430808B2 (en) 2013-06-19 2016-08-30 Microsoft Technology Licensing, Llc Synchronization points for state information
KR102263326B1 (ko) 2014-09-18 2021-06-09 삼성전자주식회사 그래픽 프로세싱 유닛 및 이를 이용한 그래픽 데이터 처리 방법
CN105118089B (zh) * 2015-08-19 2018-03-20 上海兆芯集成电路有限公司 三维图形管道中的可程序化像素设定方法及使用其的装置
US10460513B2 (en) * 2016-09-22 2019-10-29 Advanced Micro Devices, Inc. Combined world-space pipeline shader stages
EP3318741B1 (en) * 2016-11-08 2020-04-22 C.R.F. Società Consortile per Azioni A unit for conversion of thermal energy
US10726605B2 (en) * 2017-09-15 2020-07-28 Intel Corporation Method and apparatus for efficient processing of derived uniform values in a graphics processor
CN110580238A (zh) * 2018-06-11 2019-12-17 Arm有限公司 数据处理系统中的硬件单元的同步
FR3101460B1 (fr) * 2019-09-27 2021-09-03 Continental Automotive Procédé et calculateur de gestion d’échanges de données entre une pluralité de tâches
US20230097097A1 (en) * 2021-09-29 2023-03-30 Advanced Micro Devices, Inc. Graphics primitives and positions through memory buffers
US11755336B2 (en) * 2021-09-29 2023-09-12 Advanced Micro Devices, Inc. Distributed geometry

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009265843A (ja) * 2008-04-23 2009-11-12 Toyota Motor Corp マルチコアシステム、車両用ゲートウェイ装置
US20090295804A1 (en) * 2008-05-30 2009-12-03 Advanced Micro Devices Inc. Merged Shader for Primitive Amplification
US7671862B1 (en) * 2004-05-03 2010-03-02 Microsoft Corporation Systems and methods for providing an enhanced graphics pipeline
US20110050716A1 (en) * 2009-09-03 2011-03-03 Advanced Micro Devices, Inc. Processing Unit with a Plurality of Shader Engines

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2001016742A2 (en) 1999-08-31 2001-03-08 Times N Systems, Inc. Network shared memory
US7570267B2 (en) 2004-05-03 2009-08-04 Microsoft Corporation Systems and methods for providing an enhanced graphics pipeline
US7747842B1 (en) 2005-12-19 2010-06-29 Nvidia Corporation Configurable output buffer ganging for a parallel processor
US8081181B2 (en) 2007-06-20 2011-12-20 Microsoft Corporation Prefix sum pass to linearize A-buffer storage
US20090160863A1 (en) 2007-12-21 2009-06-25 Michael Frank Unified Processor Architecture For Processing General and Graphics Workload
CN101271584B (zh) 2008-04-11 2010-11-10 威盛电子股份有限公司 可编程图形处理单元计算核心的常量缓冲的方法和系统
GB2466078B (en) * 2008-12-15 2013-11-13 Advanced Risc Mach Ltd Apparatus and method for tracing activities of a shader program executed on shader circuitry of a data processing apparatus
US20110043518A1 (en) 2009-08-21 2011-02-24 Nicolas Galoppo Von Borries Techniques to store and retrieve image data

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7671862B1 (en) * 2004-05-03 2010-03-02 Microsoft Corporation Systems and methods for providing an enhanced graphics pipeline
JP2009265843A (ja) * 2008-04-23 2009-11-12 Toyota Motor Corp マルチコアシステム、車両用ゲートウェイ装置
US20090295804A1 (en) * 2008-05-30 2009-12-03 Advanced Micro Devices Inc. Merged Shader for Primitive Amplification
US20110050716A1 (en) * 2009-09-03 2011-03-03 Advanced Micro Devices, Inc. Processing Unit with a Plurality of Shader Engines

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20160001644A (ko) * 2014-06-27 2016-01-06 삼성전자주식회사 동적 최적화 지연 렌더링 파이프라인
US11508124B2 (en) 2020-12-15 2022-11-22 Advanced Micro Devices, Inc. Throttling hull shaders based on tessellation factors in a graphics pipeline
US11776085B2 (en) 2020-12-16 2023-10-03 Advanced Micro Devices, Inc. Throttling shaders based on resource usage in a graphics pipeline
WO2022211926A1 (en) * 2021-03-30 2022-10-06 Advanced Micro Devices, Inc. Wave throttling based on a parameter buffer
US11710207B2 (en) 2021-03-30 2023-07-25 Advanced Micro Devices, Inc. Wave throttling based on a parameter buffer

Also Published As

Publication number Publication date
EP2734923A1 (en) 2014-05-28
KR101630996B1 (ko) 2016-06-15
EP2734923B1 (en) 2018-01-03
US20130021360A1 (en) 2013-01-24
US9442780B2 (en) 2016-09-13
CN103649922A (zh) 2014-03-19
CN103649922B (zh) 2017-02-15
JP5770375B2 (ja) 2015-08-26
WO2013012524A1 (en) 2013-01-24
JP2014521183A (ja) 2014-08-25

Similar Documents

Publication Publication Date Title
KR101630996B1 (ko) 셰이더 동작의 동기화
JP6310151B2 (ja) グラフィックス処理におけるレンダリング対象コマンドの並べ替え
KR101563098B1 (ko) 커맨드 프로세서를 갖는 그래픽 프로세싱 유닛
KR102003655B1 (ko) 그래픽 프로세싱에서 셰도우 레이들에 대한 트리 횡단을 위한 시작 노드 결정
KR102132040B1 (ko) 그래픽스 프로세싱에서의 패치된 쉐이딩
JP5242771B2 (ja) 混合精度命令実行を伴うプログラマブルストリーミングプロセッサ
US8286198B2 (en) Application programming interfaces for data parallel computing on multiple processors
EP2820540B1 (en) Execution model for heterogeneous cpu-gpu computing
JP5960368B2 (ja) ビジビリティ情報を用いたグラフィックスデータのレンダリング
JP6271768B2 (ja) 共有されるデータチャネルを用いるシェーダパイプライン
JP2011514592A (ja) グラフィックス処理の命令レイテンシ減少のためのシステムおよび方法
US20160292812A1 (en) Hybrid 2d/3d graphics rendering
US9633411B2 (en) Load scheme for shared register in GPU
TW201926239A (zh) 以微磚為基礎之低解析度深度儲存
WO2017053022A1 (en) Speculative scalarization in vector processing
CN115516421A (zh) Gpu中基于gpr释放机制的gpr优化
US10157443B1 (en) Deferred batching of incremental constant loads

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant