CN108139897A - 在不预处理宏的情况下使用Ubershader变体的系统和方法 - Google Patents

在不预处理宏的情况下使用Ubershader变体的系统和方法 Download PDF

Info

Publication number
CN108139897A
CN108139897A CN201680057224.3A CN201680057224A CN108139897A CN 108139897 A CN108139897 A CN 108139897A CN 201680057224 A CN201680057224 A CN 201680057224A CN 108139897 A CN108139897 A CN 108139897A
Authority
CN
China
Prior art keywords
tinter
code
executable code
modules
source code
Prior art date
Legal status (The legal status 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 status listed.)
Granted
Application number
CN201680057224.3A
Other languages
English (en)
Other versions
CN108139897B (zh
Inventor
A·A·芒史
C·布里萨特
O·安德森
王梦平
R·拉马塞山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Apple Inc
Original Assignee
Apple Computer Inc
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 Apple Computer Inc filed Critical Apple Computer Inc
Publication of CN108139897A publication Critical patent/CN108139897A/zh
Application granted granted Critical
Publication of CN108139897B publication Critical patent/CN108139897B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/423Preprocessors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/4552Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
    • 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

Landscapes

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

Abstract

Ubershader可用于图形开发环境中作为效率提升工具,因为可以在单个着色器程序中捕捉许多选项和属性。所述着色器代码中属性的每个可选选项可以用属性标记以指示所述选择的存在。体现所述多个可选选项和属性的所述单个着色器程序可被编译为中间版本,所述中间版本也体现所述多个选项和属性,以及至少所述标记属性的残留项。在请求包括所期望的可选选项或属性的指示的可执行代码时,可继续所述可执行代码的生成,使得其仅包括所期望的可选选项和属性,并且不包括所述源代码中体现的其他可选选项和属性。

Description

在不预处理宏的情况下使用Ubershader变体的系统和方法
背景技术
本申请要求2015年9月30日提交的标题为“System and Method for UsingUbershader Variants Without Preprocessing Macros”的临时专利申请号662/235,502的优先权并取决于该临时专利申请,该临时专利申请全文以引用方式并入本文。
这里公开的发明涉及图形处理领域,并且不限于包括在不使用预处理宏的情况下uberhader(优步着色器)的开发和用途及其变体的系统和方法。
图形处理单元(GPU)对于处理数据并行图形任务来说已经变得重要。开发者现在认识到非图形数据并行任务也可由GPU处理,从而利用其大规模并行能力。供应商和标准化组织已经创建了由于开发者编程交互的高层级而使图形数据并行任务更易于编程的应用编程接口(API)。还存在更靠近硬件并且一般通过应用高层级API的输出而被采用的低层级API(或库/框架等)。换句话讲,高层级API一般只是准备应用于低层级API的程序代码。
GPU常常使用被称为着色器程序或着色器的程序。着色器的一个常见示例是在像素或图形(或计算等同物)上操作的程序。编写着色器的一种方式是对代码中的可选特性或属性进行编码,以便可以从相同的着色器源代码派生不同的可执行程序。这种着色器程序通常被称为ubershader。Ubershaders很方便,因为它们允许在一个着色器中实现多个编程选项。但是,可以改进与Ubershaders相关的技术。
发明内容
本公开的多个实施方案涉及与图形处理单元(GPU)一起使用软件,用于创建图形服务或计算服务。在图形开发环境中,程序员可以使用ubershaders作为提高效率的工具,以便可以在单个着色器程序中捕捉许多选项和属性。许多选项的存在意味着ubershader可以被编译成许多可执行代码版本——源代码中每个选项置换至少有一个版本。为了便于基于单个ubershader有效创建多个变体,本发明的一些实施方案提出在ubershader源代码中插入选项属性指示符以标记代码中选项的可用性。在编译执行时,可以通过引用库、字典或其他来源执行选项,以便只将必要的代码转换为可执行代码,并使正确的选项反映在该代码中。
附图说明
图1示出了可被用作例如最终用户机器或开发者机器的一种代表性计算机节点。
图2示出了与本发明的实施方案相关联的一种示例性网络环境。
图3示出了一种示例性软件层和架构示意图。
图4示出了示例性系统和过程架构。
图5示出了第二示例性系统和过程架构。
图6示出了第三示例性系统和过程架构。
具体实施方式
本公开涉及用于改进图形开发系统和图形系统的操作的系统、方法和计算机可读介质。还涉及用于图形开发系统的设计和/或操作以及最终用户设备上相关图形的渲染的多种架构。通常,本发明的许多实施方案设想使用ubershader作为在文本编辑器或开发系统中产生的着色器源代码。
在以下描述中,为了解释的目的,阐述了很多具体细节以便提供对所公开构思的彻底理解。作为该描述的一部分,本公开的附图中的一些附图以框图形式表示结构和设备,以避免模糊所公开构思的新颖方面。为了清晰起见,未对实际的具体实施的所有特征进行描述。此外,本公开中所使用的语言主要是为了可读性和指导性目的而选择的,并且可能并未被选择为描绘或界定本发明的主题,从而可能必需凭借权利要求来确定此类发明主题。在本公开中提到“一个实施方案”或“实施方案”意指结合该实施方案所述的特定特征、结构或特性被包括在所公开主题的至少一个实施方案中,并且多次提到“一个实施方案”或“实施方案”不应被理解为必然地全部涉及相同的实施方案。此外,在本公开中使用字词“或”是旨在用于指示任选的另选形式而并非指示排他性的另选形式,除非明确指出排他性。
应当理解,在任何实际具体实施的开发中(如在任何软件和/或硬件开发项目中那样),必须要作出许多决策以实现开发者的特定目标(例如,符合与系统和商务相关的约束条件),并且这些目标在不同具体实施之间可能是不同的。还应当理解,此类开发努力可能是复杂且耗时的,但是尽管如此,对于受益于本公开的在设计和实施用户接口和响应系统和/或手势识别处理系统中的普通技术人员而言会是一项常规任务。
示例性硬件和软件
本文所述的发明实施方案可在所有类型的设备中以及相对于所有类型的设备有所涉及和使用,所述设备包括单处理器和多处理器计算系统和包含单处理或多处理计算系统的直立式设备(例如相机、游戏系统、电器等)。本文中的讨论是参考可作为软件开发系统或最终用户系统进行讨论的一种常见计算配置来进行的。这个常见计算配置可具有包括一个或多个微处理器的CPU资源。本论述仅用于关于样本实施方案的举例说明,并非意图要将本发明的应用限制到所公开的硬件。具有其它(现在或未来)已知或常见硬件配置的其它系统也完全被设想和预期。在考虑上述声明的情况下,以下讨论一种典型的硬件和软件操作环境。硬件配置可例如存在于服务器、工作站、膝上型计算机、平板计算机、台式计算机、游戏平台(不管是否是便携式的)、电视机、娱乐系统、智能电话、电话、或任何其它计算设备(不管是移动式的还是固定式的)中。
参见图1,所公开实施方案可由代表性计算机系统100来执行。例如,代表性计算机系统可充当软件开发平台或终端用户设备。系统100可在任何类型的设备中实施,诸如通用计算机系统、电视机、机顶盒、媒体播放器、多媒体娱乐系统、图像处理工作站、手持式设备、或可与本文所述显示器或展示设备耦接或者可包含本文所述显示器或展示设备的任何设备。计算机系统100可包括一个或多个处理器105、存储器110(110A和110B)、一个或多个存储设备115、以及可包括一个或多个GPU的图形硬件120。计算机系统100还可具有设备传感器125,设备传感器可包括以下中的一者或多者:深度传感器(诸如深度相机)、一个或多个3D深度传感器、成像设备(诸如固定和/或支持视频的图像捕捉单元)、RGB传感器、接近传感器、环境光传感器、加速度计、陀螺仪、任何类型的静止或视频相机、LIDAR设备、SONAR设备、麦克风、CCD(或其他图像传感器)、红外传感器、温度计等。这些以及其他传感器可与一个或多个GPU、DSP或常规微处理器结合与适当的编程一起工作,从而传感器输出可被正确地解释和/或组合并解释。
返回图1,系统100还可包括通信接口130、用户接口适配器135、和显示器适配器140,所有这些可经由系统总线或背板145耦接。存储器110可包括处理器105和图形硬件120使用的一个或多个不同类型的介质(例如固态、DRAM、光学、磁等)。例如,存储器110可包括存储器高速缓存、只读存储器(ROM)、和/或随机存取存储器(RAM)。存储装置115可包括一个或多个非暂态存储介质,包括例如磁盘(固定盘、软盘和可移除盘)和磁带、光学介质(诸如CD-ROM和数字视频光盘(DVD))、以及半导体存储器设备(诸如电可编程只读存储器(EPROM)和电可擦除可编程只读存储器(EEPROM))。存储器110和存储装置115可用于保持媒体(例如音频、图像、和视频文件)、偏好信息、设备配置文件信息、被组织成一个或多个模块且以任何期望的计算机编程语言编写的计算机程序指令、和任何其它合适的数据。当被处理器105和/或图形硬件120执行时,此类计算机程序代码可实施本文所述方法或过程中的一者或多者。通信接口130可包括基于半导体的电路,并且可被用于将计算机系统100连接到一个或多个网络。示例性网络包括但不限于:本地网络诸如USB网络;商业局域网;以及广域网诸如互联网,并且可以使用任何合适的技术(例如,有线或无线)。可实施的通信技术包括基于蜂窝的通信(例如LTE、CDMA、GSM、HSDPA等)或其它通信(以太网、WiFi、Bluetooth、USB、Thunderbolt、Firewire等)。用户接口适配器135可用于连接键盘150、麦克风155、指针设备160、扬声器165、和其它用户接口设备诸如触摸板和/或触摸屏(未示出)。显示器适配器140可用于连接一个或多个显示单元170。
处理器105可执行实施或控制由系统100所执行的多种功能的操作(例如,评估、变换、和图形程序编译)所必要的指令。处理器105可例如驱动显示器170并可从用户接口适配器135或系统所实施的任何其它用户接口接收用户输入。用户界面135例如可呈现多种形式诸如按钮、小键盘、拨号盘、点击轮、键盘、显示屏和/或触摸屏。处理器105可以是任何类型的计算设备,诸如单独或与一个或多个GPU结合工作的一个或多个微处理器、DSP、片上系统设备诸如在一些移动设备中找到的那些。处理器105可包括一个或多个专用GPU或图形子系统,其接受程序指令以生成或改变显示信息诸如像素。此外,处理器105可基于精简指令集计算机(RISC)或复杂指令集计算机(CISC)架构或任何其它合适的架构,并且可包括一个或多个处理核心。图形硬件120可以是用于处理图形和/或辅助处理器105执行计算任务的专用计算硬件。在一些实施方案中,图形硬件120可包括CPU集成的图形和/或一个或多个可编程GPU,其可按串行或并行协作来操作。系统100(实现本文所讨论的一个或多个实施方案)可以为一个或多个用户提供通过用户活动来控制相同系统(例如,系统100)或另一个系统(例如,另一个计算机或娱乐系统)的装置,所述用户活动可包括自然活动和/或预先确定的手势诸如手部动作。
来自传感器125的输出可至少部分地由处理器105和/或图形硬件120、和/或结合在系统100内或没有系统100的专用图像处理单元来处理。如此捕捉的信息可被存储在存储器110和/或存储装置115和/或在所附接的网络上能访问的任何存储装置中。存储器110可包括由处理器105、图形硬件120和传感器125用以执行设备功能的一个或多个不同类型的介质。存储装置115可存储数据,诸如媒体(例如音频、图像和视频文件);媒体的元数据;计算机程序指令;和其它软件;包括数据库应用(例如存储角色帧的数据库)、偏好信息、设备配置文件信息和任何其它合适的数据。存储器110和存储装置115可用于保持经编译形式的或者以任何期望的计算机编程语言编写的被组织成一个或多个模块的计算机程序指令或代码。当例如由处理器105或系统中的一个或多个GPU执行时,此类计算机程序代码可实施本文所述动作或功能中的一者或多者(例如,编译着色器代码、生成可执行代码或执行可执行代码)。
图2示出了示例性网络架构200,在该网络架构内可实施所公开的技术并且所公开的硬件可位于该网络架构内。这个示例性网络200可包括多个网络205(即205A、205B和205C),其中每一个可采用任何形式,包括但不限于局域网(LAN)或广域网(WAN),诸如互联网。另外,网络250可使用任何期望的技术(有线、无线或其组合)和协议(例如传输控制协议TCP)。能够操作服务器应用程序诸如数据库并且还能够通过网络205进行通信的数据服务器计算机210(即210A和210B)耦接到网络205。使用服务器计算机的一个实施方案可涉及一个或多个中央系统的操作以处理图形信息并将经处理的信息发布到网络上的节点。
可采用任何智能电话、游戏系统、平板计算机、计算机、机顶盒、娱乐设备/系统、电视机、电话、通信设备或智能机器(包括嵌入式系统)的形式的客户端计算机215(即215A、215B和215C)也可耦接到网络205和/或数据服务器计算机210。在一些实施方案中,网络架构210还可包括网络打印机诸如打印机220和可用于存储多媒体项目或本文提及的其它数据的存储系统诸如225。为了便于不同网络设备(例如数据服务器210、最终用户计算机215、网络打印机220和存储系统225)之间的通信,至少一个网关或路由器230可任选地耦接在它们之间。此外,为了便于此类通信,利用网络的每个设备可包括网络适配器电路和相关软件。例如,如果期望以太网网络用于通信,则每个参与设备必须具有以太网适配器或支持以太网的嵌入式IC。另外,所述设备可带有用于其可能参与的任何网络(包括但不限于PAN、LAN、WAN、和蜂窝网络)的网络适配器。
如上所述,本文公开的发明的实施方案包括软件。就此,提供常见计算软件架构的描述,如图3中的层图中所表述。与硬件示例类似,这里讨论的软件架构并不旨在以任何方式是排他性的,相反是例示性的。这对于层类型图尤其如此,软件开发者往往会以略微不同的方式对层类型图进行表述。在这种情况下,描述开始于层从对硬件进行例示的基底硬件层395开始,硬件可包括CPU和GPU或其它处理和/或计算机硬件。在硬件层上方是O/S内核层390,其将一个示例示为O/S内核345,O/S内核是可执行存储器管理、设备管理和系统调用(常常是硬件驱动器的权限)的内核软件。这里采用的标记一般性地旨在说明层中所示的软件元素使用来自下面的层的资源并为上面的层提供服务。然而在实践中,特定软件元素的所有部件可能并不完全按该方式作用。
返回图3,层385是由O/S服务350举例说明的O/S服务层。O/S服务可提供受保护环境中的核心O/S功能。此外,层385中所示的O/S服务可包括用于OpenGL 351、Metal 352、软件光线跟踪器353和纯软件光栅器354的框架。这些具体示例都与图形和/或图形库有关,并且被选择以用于说明与图形处理有关的本文多个实施方案的话题。这些具体示例还表示可在框架的较低等级中操作的图形框架/库,从而开发者可使用着色和图形基元和/或获得对图形硬件的相当紧密耦接的控制。此外,图3中指定的具体示例还可将其工作产物传递给硬件或硬件驱动器。
再次参考图3,OpenGL 351表示熟知的用于图形渲染(包括2D和3D图形)的库和应用编程接口的示例。Metal 352还表示所发布的图形库和框架,但其是比OpenGL 351低的层级,从而支持组织、处理和提交图形和计算命令以及管理那些命令的相关联数据和资源的细粒度低层级控制。软件光线跟踪器353是用于基于跟踪图像平面中穿过像素的光路径的过程来生成图像信息的软件。纯软件光栅器354一般是指用于在没有专门的图形硬件(例如只利用CPU)的情况下生成图形信息诸如像素的软件。在O/S服务层385内示出的这些库或框架仅仅是示例性的,并且旨在用于展示层的一般层级以及其在样本布置(例如内核操作通常在下面,并且高层级应用程序服务360通常在上面)中如何与其它软件有关。此外,可能有用的是要注意,Metal 352表示本领域开发人员已知的Apple Inc.的所发布框架/库。此外,OpenGL 351可表示Apple Inc.当前或以前发布的软件版本中存在的框架/库。
在O/S服务层385上方有应用程序服务层380,其包括Sprite Kit 361、Scene Kit362、核心动画363和核心图形364。O/S服务层表示通常被应用程序直接访问的高层级框架。在本公开的一些实施方案中,O/S服务层包括图形有关的框架,其是高层级,因为其对下面的图形库(诸如参考层385讨论的那些)是不可知的。在此类实施方案中,这些高层级图形框架意在以用户/开发者更加友好的方式为开发者提供对图形功能性的访问并允许开发者免除与着色和图形基元的工作。以举例的方式,Sprite Kit 361是Apple Inc.提供的图形渲染和动画基础结构。Sprite Kit 361可用于对纹理图像或“子图形”动画化。Scene Kit 362是来自Apple Inc.的3D渲染框架,其支持在比具有类似能力的框架诸如OpenGL高的层级导入、操纵和渲染3D资产。核心动画363是Apple Inc.提供的图形渲染和动画基础结构。核心动画363可用于对视图以及应用的其它视觉元素动画化。核心图形364是来自Apple Inc.的二维绘图引擎。核心图形365提供用于应用的2D渲染。
在应用服务层380上方有应用层375,其可包括任何类型的应用程序。以举例的方式,图3示出了三个特定应用程序:照片应用程序371(照片管理、编辑和分享程序)、财务程序372(财务管理程序)和电影应用程序373(电影制作和分享程序)。应用层375还示出了两个通用应用370和374,其表示存在任何其它应用可与本文所公开的本发明实施方案交互或可作为本文所公开的本发明实施方案的一部分。一般来讲,本发明的实施方案采用生成可显示/可查看内容的应用和/或与其交互。对于本公开的实施方案,用于创建着色器源代码的文本编辑器和软件开发环境通常在应用层中操作,但也可具有更低层级部件。编译器和可执行代码生成器也可在应用层中操作,但在一些实施方案中可作为对应用的服务来操作并且因此仅位于更低层级中或者除了存在于应用层之外还位于更低层级中。
在评估O/S服务层385和应用服务层380中,可能有用的是认识到不同框架具有较高或较低层级应用程序接口,即使框架被表示在图3示意图的相同层中也是如此。图3的例示用于提供一般性指导以及提出后面可能要讨论的示例性框架。此外,本发明的一些实施方案可表明,层380中的框架利用层385中表示的库。因此,图3提供用于这些示例的知识强化。重要地,图3并非意图限制可以任何特定方式或在任何特定实施方案中使用的框架或库的类型。
Ubershader编程泛型
本公开的多个实施方案涉及与图形处理单元(GPU)一起使用软件,用于创建图形服务或计算服务。参考图4,通常以所示的方式生成着色器或片段程序以提交给GPU。可以在开发者计算机系统上开发着色器的源代码405,该开发者计算机系统可以是任何胜任此项任务的计算机系统,包括最终用户系统或服务器。在安装到最终用户设备之前,通常使用编译程序450编译着色器,该编译程序产生编译代码410。图形领域中相对常见的做法是编译代码410是可能还不能在GPU上执行的一种中间类型的编译代码。在一些实施方案中,该编译/中间代码可以作为操作系统的一部分或预安装的应用程序预先安装在最终用户设备上。在其他实施方案中,该编译/中间代码410可以作为应用程序安装或对操作系统或任何应用程序的软件升级的一部分安装到最终用户设备上。在运行时,当需要编译/中间代码410下面的功能或服务时,运行代码生成器455提供可执行代码415以提交给GPU供执行。
在许多情况下,着色器源代码405可由开发者编写以涵盖可启用或禁用的多条代码路径。例如,在一些实施方案中,每条代码路径表示着色器的可选或任选属性或特征。在特定示例中,着色语言诸如GLSL、HLSL或GPGPU语言(例如,CUDA)可以使用预处理程序宏来为编译器描述和提取这些特征,以便可以为许多离散特征集合生成编译的着色器代码。因此,在这些示例中,开发者针对着色器源代码405中表达的每个离散的特征/属性选择生成特定着色器变体。通过用合适的预处理程序宏编译着色器源代码405来生成每个变体。
前面的示例可以在典型的编程过程中找到,诸如用于使用Apple的Metal着色器进行编译的编程过程。通常情况下,Metal着色器通过将Metal着色器源文件添加到开发项目(例如,Apple Xcode项目)进行离线编译。开发者软件包(例如,Xcode)使用编译器工具(例如,Metal命令行工具)编译着色器源代码,以产生应用程序可以稍后加载的二进制文件(例如,使用来自MTLLibrary类的API)。也可以通过使用不同的编译器工具或同一工具中的API(例如,MTLLibrary API)在运行(例如,“在线”)时进行编译。但是,当使用离线编译器时,可以设置选项或选项标记来控制预处理。例如,当使用Apple的Metal进行离线编译时,可能会设置选项标记来控制预处理程序行为、选择标准库中的数学函数,并请求其他选项。此外,当使用在线编译器(例如,Metal编译器)时,可以通过不同编程资源(例如,对于Apple系统,使用MTLCompileOptions类)使用选项(尽管可能是离线选项的子集)。无论是哪种情况,都可以选择这些选项进行编译,并且可以在编译操作期间执行这些选项。
一些示例选项可能包括预处理程序选项、数学本征选项、控制语言版本的选项以及抑制警告的选项。预处理程序选项控制编译之前在每个着色器源文件上运行的预处理程序(例如,宏或Apple Metal预处理程序)。虽然不同实施方案可提供不同的功能,但预处理程序宏的一个相关特征是允许程序员在中间代码或可执行代码中改变着色器的哪些特征被启用或禁用。
使用Ubershader
现在参见图5,示出了一个示例。源代码505被指示为ubershader代码以指代具有不同代码路径的着色器,例如,可以例如(并且在一些实施方案中)可通过代码中的选项来选择的许多不同的特征/属性。如图5所示,可以通过预处理程序宏520选择和提取属性/特征集合的每个变体,并且如由ubershader源代码505和预处理程序宏520之间的许多箭头所指示的,宏520可以被应用多次以创建单独变体以提交给编译器。例如,可以在着色器505上或在该着色器中运行预处理程序宏520以创建可执行或中间表示,该可执行或中间表示提供由宏进行选择的特定选项集合(即着色器505的启用或禁用特征)。在一些实施方案中,预处理程序宏被编码到ubershader中,例如作为#ifdefs。在其他实施方案中,一旦特征/属性被预处理程序宏520提取成到一个或多个变体中,即可将每个变体提交给编译器550以便为每个变体产生编译/中间代码。如图5所示,通过许多箭头所指示的,编译/中间代码510单独表示的变体的数量可能极多。因此,为了访问ubershader505的所有特征变体,必须执行许多不同的编译循环,创建可执行版本或中间版本的许多版本/变体(即选项设置的每个置换各一个)。这可能会产生非常大的资产文件,这些资产文件对于在最终用户设备上的传输、安装和/或使用可能不方便或不合需要。
在不预处理宏的情况下使用Ubershader
本公开的各种实施方案涉及在不使用预处理程序宏的情况下生成或编译Ubershader。例如,参照图6,ubershader 605是具有一个或多个(但通常很多)可选特征和/或属性的着色器源代码。在一些实施方案中,着色器源代码605可通过代码中的指示(“选项指示符”)进行增强,从而标记出开发者希望在最终用户设备上实行的每个变体和/或可选/任选特征。源代码可以由编译器650编译,编译器可以理解选项指示符的含义并且可以将选项指示符的含义或实际选项指示符传递到编译/中间代码610中。例如,可以在可实行特征或属性的位置处将选项指示符标志放置在着色器源代码中。在一些实施方案中,编译代码610包含来自着色器源代码605的选项指示符或传达可用选项含义的选项指示符的版本。
在一些实施方案中,编译/中间代码被加载到最终用户设备上并且可以在运行时或之前(例如,当应用程序启动时)被转换为可执行代码615。值得注意的是,在许多实施方案中,编译的中间代码610反映了着色器源代码605可用的所有选项/特征。在其他实施方案中,可以出于任何可能的原因(例如,最终用户软件或硬件的功能)有意识地排除一些选项。在任何情况下,一个或多个实施方案可以使用运行代码生成器655来创建可执行的GPU代码。在一些实施方案中,创建可执行代码615的时间基于相关应用程序的行为。例如,可以及时创建可执行代码供使用,或者在启动应用程序或任何应用程序模块时创建可执行代码。代码生成器655可以是适用于将编译/中间代码610转换成用于目标GPU的适当可执行代码的编译器或其他软件。
如图6中的箭头所示,编译/中间代码610可以通过运行代码生成器生成许多不同版本的可执行代码615。每个版本或变体可以表示着色器源代码605的选项的不同选择。因此,通过使用本发明的某些实施方案,不需要针对每个ubershader或多功能着色器运送或存储数千个资产。
实施
如上所述,本公开的许多实施方案提供了在不预处理宏的情况下使用ubershader。在一些实施方案中,可以通过在着色器源代码中提供选项指示符来实现这一结果。如上所述,代码中选项指示符标志点与着色器的可选特征相关。在一个或多个实施方案中,将选项指示符或其表示引入到代码的编译版本(诸如中间版本)。此外,在一些实施方案中,当在最终用户设备上调用编译/中间代码时,调用可以包括关于要实行的选项指示符的指定。换句话讲,该指定用于指示着色器的哪些特征处于启用或禁用状态。这样,可以在运行时通过指定或操纵选项指示符(或其衍生物)来调用可从着色器源代码605获得的任何选项集合。在与Apple的Metal框架相关的一个特定示例中,当.air代码被转换为可执行代码时,实行或调用选项。
在本发明的一个或多个实施方案中,离线编译(通过例如编译器650)仅发生一次。在这些实施方案中,由源代码提供的所有特征保持存在于编译/中间代码(例如,610)中,并且可以在创建可执行代码时启用或禁用。本公开的一些实施方案还提供了允许选择要在可执行代码中启用的选项/特征的工具。该工具可能是一个开发者工具,通过在最终用户设备上进行编程(可包括条件编程),该工具为程序员提供了这种能力。
常量属性
在本公开的一些实施方案中,可以采用ubershader属性作为选项指示符。例如,当在着色器源代码中声明常量或变量时,可以使用ubershader属性和任何所需的附加信息来标记该常量或变量。在一些实施方案中,为了便于使用选项指示符(诸如ubershader属性),着色器语言可以被扩展为包括这些项目。例如,Apple的Metal着色语言可以扩展为允许在常量地址空间声明的程序范围变量具有属性[[uber_shader_constant(expression)]],该属性用于将它们标识为ubershader属性。在一些实施方案中,ubershader属性不需要着色器源代码中的初始化。在一个或多个实施方案中,例如,在创建渲染或计算管道状态时,可以稍后初始化ubershader属性。此外,请注意上述示例代码中“expression”的使用,表明ubershader属性可以指定表达式,诸如程序范围中声明的常量/变量的布尔表达式(Boolean expression)。
下面显示了用于Apple Metal的ubershader属性的示例,但可扩展到任何着色器上下文:
[1]constant int a[[uber_shader_constant]];
[2]constant bool b[[uber_shader_constant]];
[3]constant int c[[uber_shader_constant((a==1)&&b)]];
参考上面的行[1]和[2],示出了变量“a”和“b”被赋予了ubershader属性。在一些实施方案中,当创建渲染或计算管道状态时指定ubershader变量“a”和“b”的值。如上述行[3]显而易见的是,在一个或多个实施方案中,可以基于ubershader变量“a”和“b”的值来计算ubershader变量“c”的值。在一些实施方案中,常量类型可以包括int、bool和float。作为参考:“bool”表示条件数据类型,并且在一些实施方案中,表示具有值真或假的数据类型,其中值真扩展为整数常量1,并且值假扩展为整数常量0;int表示整数,并且在一些实施方案中是带符号二进制补码32位整数;并且float表示浮点,在一些实施方案中,包括32位浮点,其中float数据类型必须符合IEEE 754单精度存储格式。
如上所述,在一些实施方案中,当着色器源代码被编译时,在编译/中间代码中记录ubershader属性(例如,Apple AIR)。因此,在一个或多个实施方案中,当创建可执行代码时,可以将ubershader属性中的常量或变量(例如,上述示例中的“a”、“b”和“c”)的值插入选项指示符表达式中(例如,在AIR中)来访问或生成正确的可执行代码。
作为示例,下表并列示出了预处理宏语句和本公开的一些实施方案中使用的ubershader属性语句。最后一个示例显示了周围代码的上下文:
在一个或多个实施方案中,使用[[uber_shader_constant]]属性声明的uberhader常量只能是标量或矢量类型,并且在其中一些实施方案中,只能由Metal支持。在这些实施方案中,使用具有[[uber_shader_constant(index)]]属性的用户定义类型或标量或矢量类型的数组将会产生编译错误。
作为另一个示例,在下面的表格中,并列示出了参数声明的基于宏的语句和使用本公开的一个实施方案的类似语句。
如图所示,在一些实施方案中,可以使用[[uber_shader_constant(expression)]]属性限定符来声明着色器的参数,从而标识该参数是可选的并且与布尔ubershader表达式相关联(由expression标识)。如果expression为真(例如,当从中间代码诸如AIR编译为设备可执行代码时确定),则定义参数。在这些实施方案中,如果expression为假,则不定义参数,因此在着色器中使用参数将导致编译时错误。
作为又一个示例,在下面的表格中,并列示出了预处理程序基于宏的结构和使用本公开的一个实施方案的类似结构。
在一些实施方案中,可以使用[[uber_shader_constant(expression)]]属性限定符来声明结构元素,从而标识该参数是可选的并且与布尔uber-shader表达式相关联(由expression标识)。在一个或多个实施方案中,如果expression为真(当从中间表示诸如Apple AIR编译为设备可执行代码时确定),则定义该元素。在这些实施方案中,如果expression为假,则该元素未被定义,因此在着色器中使用参数将导致编译时错误。
API-填充变量
如上所述,在本公开的一些实施方案中,常量(或变量)或选项指示符(例如,ubershader属性)在产生可执行代码时或其附近被填充和解析。在一个或多个实施方案中,可以采用库或字典,由此可以参考库或字典以在解析属性之前以及在生成可执行代码之前或期间恢复要填充的变量或常量的值。在与Apple Metal有关的一些实施方案中,每个常量的值可以在用于可执行代码生成器的管道描述符上设置,因此代码生成器可能能够生成最终程序。在一个特定实施方案中,使用一种方法来查询称为MTLFunctionConstantDictionary的常量字典函数,如下所示:
以下示出了示例代码:
descriptor.functionConstants[@“propertyName”]=[NSNumbernumberWithInt:10];
在一些实施方案中,变量或常量也可以是通过MTLFunction上的反射进行的查询。MTLFunction可以表示函数以其名称和类型导出的给定常量。在一个或多个实施方案中,仅支持有限数量的类型(MTLDataTypeBool、MTLDataTypeInt、MTLDataTypeFloat、MTLDataTypeUInt):
可以如下查询包含由给定函数导出的所有常量列表的数组的一个示例:
作为参考,在上面引用MTLFunction的实施方案和示例中,其表示着色器或计算函数。例如,MTLFunction对象可以表示一个单独的函数,该函数通过Metal着色语言编写,并在GPU上作为图形或计算管道的一部分执行。有关Metal着色语言的更多详细信息,请参阅Apple的Metal着色语言指南。在某些实施方案中,为了在Metal运行函数和用Metal着色语言编写的图形或计算函数之间传递数据或状态,必须对纹理、缓冲区和采样器进行参数索引的分配。参数索引标识哪些纹理、缓冲区或采样器由Metal运行代码和Metal着色代码同时引用。对于渲染过程,代码可以指定一个MTLFunction对象用作MTLRenderPipelineDescriptor对象(或类似对象)中的顶点或片段着色器,如附录或参考Apple指南中所讨论的。对于计算过程,代码可以在为目标设备创建MTLComputePipelineState对象(或类似对象)时指定MTLFunction对象,如附录或参考Apple指南中所讨论的。
在现有系统上的具体实施
本文所述实施方案中的一者或多者可被认为是当前公知的图形开发环境和框架的修改型式。参考图4,编译器450可以被改变以接收、理解和处理选项指示符。在AppleMetal范式中,这与对CLANG进行更改类似。此外,运行代码生成器可以被改变以允许指定常量并且将中间代码转换为可执行代码,同时考虑指示将存在于可执行代码中的源代码的特征的变量和/或常量的值。
应当理解,以上描述旨在是示例性的而非限制性的。已呈现材料以使得本领域的任何技术人员能够作出和使用受权利要求保护的发明,并在特定实施方案的上下文中提供该材料,其变化对于本领域的技术人员而言将是显而易见的(例如,可彼此结合使用所公开的实施方案中的多个实施方案)。此外应当理解,本文所标识的操作中的一些操作可以不同的顺序来执行。因此应当参考所附权利要求以及赋予此类权利要求的等同形式的完整范围来确定本发明的范围。在所附权利要求中,术语“包括(including)”和“其中(in which)”被用作相应术语“包括(comprising)”和“其中(wherein)”的通俗的英语等同形式。
为了帮助读者理解与这个讨论有关的细节,下面是一个四部分附录。附录的A部分显示了与本文讨论的概念相关联的示例API实施方案。附录的B部分显示了用于实现本文所讨论的一个或多个实施方案的实施信息和示例代码。部分C示出了由Apple Inc.出版的表示为Metal着色语言指南4.9节的草案版本的示例实施方案信息。最后,部分D示出了用于结合本文所讨论的实施方案使用的说明性API描述。
附录A部分
1.API-填充变量
2.如在说明书正文中所述的,在本公开的一些实施方案中,常量(或变量)或选项指示符(例如,ubershader属性)在产生可执行代码时或其附近被填充和解析。在一个或多个实施方案中,可以采用库或字典,由此可以参考库或字典以在解析属性之前以及在生成可执行代码之前或期间恢复要填充的变量或常量的值。在涉及Apple Metal的一些实施方案中,每个常量的值可以应用函数(MTLFunction)来生成新的专用函数。在一个特定实施方案中,借助一种方法来使用一组常数来创建专用函数。本说明书的正文部分示出了一些示例,下面是更多的更新示例:
3.以下示出了示例代码:
float value=3.0f;
[values setConstantValue:&value type:MTLDataTypeFloatwithName:@“constantName”];
id<MTLFunction> specializedFunction = [library newFunctionWithName:@“functionName” constantValues:values error:&error];
4.在一些实施方案中,变量或常量也可以是通过MTLFunction上的
反射进行的查询。MTLFunction可以表示函数以其名称和类型导出
的给定常量。
5.
@interface MTLFunctionConstant:NSObject
@property(readonly)NSString*name;
@property(readonly)MTLDataType type;
@property(readonly)NSUInteger index;
@property(readonly)BOOL required;
@end
6.可以如下查询包含由给定函数导出的所有常量列表的数组的一个示例:
作为参考,在上面引用MTLFunction的实施方案和示例中,其表示着色器或计算函数。例如,MTLFunction对象可以表示一个单独的函数,该函数通过Metal着色语言编写,并在GPU上作为图形或计算管道的一部分执行。有关Metal着色语言的更多详细信息,请参阅Apple的Metal着色语言指南。在某些实施方案中,为了在Metal运行函数和用Metal着色语言编写的图形或计算函数之间传递数据或状态,必须对纹理、缓冲区和采样器进行参数索引的分配。参数索引标识哪些纹理、缓冲区或采样器由Metal运行代码和Metal着色代码同时引用。对于渲染过程,代码可以指定一个MTLFunction对象用作MTLRenderPipelineDescriptor对象(或类似对象)中的顶点或片段着色器,如在创建渲染 管道状态中所讨论的。对于计算过程,当为目标设备创建MTLComputePipelineState对象时代码可指定MTLFunction对象,如在为计算命令编码程序指定计算状态和资源中所描述的。
附录B部分
使用Metal着色语言的Uber-shader
今天在使用Metal和其他着色语言时,开发者在编写ubershaders时必须使用预处理程序宏。在生成ubershader的特定变体时,预处理程序宏定义被指定为编译器的输入。
与离线着色编译器一起使用ubershader的预处理程序宏的主要问题在于,必须生成开发者可能想要使用的所有ubershader的特定变体,这可能会导致着色器库资源的大小急剧增加。
以下建议允许开发者以与使用预处理程序宏相同的易用性编写ubershader,但在从AIR编译为设备可执行代码时,会移动ubershader特定变体的生成。开发者不再需要离线编译他们计划在其应用中使用的ubershader的所有变体。
在Metal着色语言中描述uber-shader变量
Metal着色语言被扩展以允许在常量地址空间声明的程序范围变量具有属性[[uber_shader_constant(expression)]],该属性用于将它们标识为uber-shader变量。这些变量未在着色器源代码中初始化,而是在创建渲染或计算管道状态时指定它们的值。expression是可选的,并且用于指定程序范围内声明的常量变量的布尔表达式。
示例:
constant int a[[uber_shader_constant]];
constant bool b[[uber_shader_constant]];
constant int c[[uber_shader_constant((a==1)&&b)]];
当创建渲染或计算管道状态时指定ubershader变量a和b的值。基于uber-shader变量a和b的值计算uber-shader变量c的值。
让我们看一下uber-shader使用预处理程序宏的各种情况:
1)使用预处理程序宏来控制uber-shader中的代码路径以进行编译
考虑使用预处理程序宏的Crytek的以下着色器:
现在使用uber-shader变量编写的相应着色器将是:
constant bool realtime_shadow[[uber_shader_constant]];
constant bool med_quality[[uber_shader_constant]];
constant bool high_quality[[uber_shader_constant]];
constant bool postprocess[[uber_shader_constant]];
vertex VertexOutput
使用[[uber_shader_constant]]属性声明的uber-shader变量只能是Metal所支持的标量或矢量类型。使用具有[[uber_shader_constant(index)]]属性的用户定义类型或标量或矢量类型的数组将会产生编译错误。
2.在声明着色器的参数时使用预处理程序宏
例如,Crytek在其着色器声明中使用如下的预处理程序宏:
可以使用[[uber_shader_constant(expression)]]属性限定符声明着色器的参数,以标识该参数是可选的,并且与expression标识的布尔uber-shader表达式相关联。如果expression为真(当从AIR编译为设备可执行代码时确定),则定义参数。如果expression为假,则不定义参数,因此在着色器中使用该参数将导致编译时错误。
现在使用uber-shader属性编写的相应着色器将是:
3.预处理程序宏是结构
考虑以下示例:
可以使用
[[uber_shader_constant(expression)]]属性限定符来声明结构的元素,以标识该参数是可选的,并且与由expression标识的布尔uber-shader表达式关联。如果expression为真(当从AIR编译为设备可执行代码时确定),则定义元素。如果expression为假,则不定义元素,因此在着色器中使用该参数将导致编译时错误。
现在使用uber-shader属性编写的相应着色器将是:
更改为AIR以支持uber-shader常量
·AIR将需要生成元数据,该元数据描述使用[[uber_shader_constant(expression)]]限定符声明的所有程序范围变量。
·将[[uber_shader_constant(expression)]]属性数据添加到着色器参数元数据。
·将[[uber_shader_constant(expression)]]属性数据添加到结构反射信息。
创建渲染或计算管道状态时在API中指定uber-shader值
TBD.
附录C部分
4.9程序范围函数常量
在Metal先前的修订版中,开发者在编写ubershader时不得不使用预处理程序宏。Uber-shader是一个大型着色器,它经过多次编译,通过不同的预处理程序宏定义来启用着色器中的不同功能。预处理程序宏定义被指定为Metal着色语言编译器的输入,以生成ubershader的特定变体。与离线编译一起使用ubershader的预处理程序宏的主要问题在于,必须生成开发者可能想要使用的所有ubershader的特定变体,这可能会导致着色器库资源的大小急剧增加。
Metal着色语言现在允许开发者以与使用预处理程序宏相同的易用性编写ubershader,但在创建管道状态时,会移动ubershader特定变体的生成。开发者不再需要离线编译他们计划在其应用程序中使用的ubershader的所有变体。
4.9.1指定程序范围函数常量
Metal着色语言扩展为允许使用以下属性声明程序范围变量:
[[function_constant(index)]]
使用[[function_constant(index)]]属性声明的程序范围变量,或者通过使用该属性声明的变量初始化的程序范围变量称为函数常量。
这些函数常量不会在Metal着色器源代码中初始化,而是会在创建渲染或计算管道状态时指定它们的值。index用于指定可用于在运行时引用函数常量变量(而不是其名称)的位置索引。
示例:
constant int a[[function_constant(0)]];
constant bool b[[function_constant(2)]];
在常量地址空间中声明的程序范围中的变量也可以使用函数常量进行初始化。
示例:
constant int a[[function_constant(0)]];
constant bool b[[function_constant(2)]];
constant bool c=((a==1)&&b);
constant int d=(a*4);
函数常量a和b的值在创建渲染或计算管道状态时指定。
以下内置功能:
bool is_function_constant_defined(name)
可用于确定函数常量是否可用,即在创建渲染或计算管道状态时已定义。name必须引用一个函数常量变量。
如果在创建渲染或计算管道状态时定义了函数常量变量,则is_function_constant_defined(name)返回真,否则返回假。
如果在创建渲染或计算管道状态时未定义函数常量变量值,并且如果使用渲染或计算管道状态指定的图形或内核函数使用这些函数常量,则该行为将与使用is_function_constant_defined(name)替代name时的行为相同,并且由is_function_constant_defined(name)返回的值为假。
可以在Metal中会用函数常量:
·控制编译的代码路径,
·指定函数的可选参数(图形、内核或用户函数),并且
·指定使用[[stage_in]]限定符声明的结构的可选元素。
4.9.1.1使用函数常量控制要编译的代码路径
考虑针对ubershader常量使用预处理程序宏的以下着色器:
现在使用函数常量变量编写的相应着色器将是:
函数常量只能是标量或矢量类型。针对函数常量使用用户定义类型或标量或矢量类型的数组将会产生编译错误。
4.9.1.2在声明函数参数时使用函数常量
可以使用[[function_constant(name)]]属性限定符来声明图形、内核或用户函数的变体,以标识该变体是可选的。name指函数常量变量。如果由name给出的函数常量变量的值非零或为真(在创建渲染或计算管道状态时确定),则认为该变体在函数签名中声明。如果由name给出的函数常量变量的值为0或假,则认为该变体不在函数签名中声明。如果name引用尚未定义的函数常量变量(在创建渲染或计算管道状态时确定),则该行为将与使用is_function_constant_defined(name)的行为相同,并且其值为假。
考虑以下在其函数声明中使用预处理程序宏的分段函数:
现在使用函数常量编写的相应分段函数将是:
下面是另一个示例,显示了如何使用带函数参数的函数常量:
4.9.1.3针对[[stage_in]]结构的元素使用函数常量
用[[stage_in]]限定符声明的结构元素也可以用[[function_constant(name)]]属性限定符声明,以标识该元素是可选的。name指函数常量变量。如果由name给出的函数常量变量的值非零或为真(在创建渲染或计算管道状态时确定),则认为结构中的元素在函数签名中声明。如果由name给出的函数常量变量的值为0或假,则认为该元素不在结构中声明。如果name引用尚未定义的函数常量变量(在创建渲染或计算管道状态时确定),则该行为将与使用is_function_constant_defined(name)的行为相同,并且其值为假。
示例:
附录D部分
API描述
创建常量值
MTLFunctionConstantValues用于指定一组可用于专门化函数的常量值。常量可以通过索引或名称来设置。API还支持使用索引范围同时设置多个常量值。
用户可以设置多个功能之间共享的常量值(例如,对应于用户设置),并将相同的一组值应用于所有这些函数。
@interface MTLFunctionConstantValues:NSObject
//使用索引
-(void)setConstantValue:(const void*)value type:(MTLDataType)type
atIndex:(NSUInteger)index;
-(void)setConstantValues:(const void*)values type:(MTLDataType)type
withRange:(NSRange)range;
//使用名称
-(void)setConstantValue:(const void*)value type:(MTLDataType)type
byName:(NSString*)name;
//删除所有常量
-(void)reset;
@end
获得专门功能
依赖函数常量的函数不能直接用于创建渲染管道或计算管道。必须使用以下方法之一,通过提供原始函数的名称以及所有必需常量的值,才能从MTLLibrary中获得新函数:
对于不依赖函数常量的函数,该方法只返回原始函数。否则,该方法将返回一个用于管道状态对象的新函数。常量值首先按索引查找,然后按名称查找。如果找不到常量,则该方法返回nil并返回错误。
创建专用函数需要调用编译器,这就是为什么提供异步变体的原因。异步变体使应用程序能够调度许多专门化请求,并且在执行专门化时完成一些其他工作。
函数常量反射
MTLFunction上的functionConstants属性和functionConstantIndexByName:type:方法允许用户查询给定函数的命名常量,以发现该值是否是必需的,或者查找常量的索引:
@property(readonly)NSArray*functionConstants;
-(NSUInteger)functionConstantIndexByName:(NSString*)name
type:(MTLDataType*)type;
应在非专门函数上查询functionConstants(通过在MTLLibrary上调用newFunctionWithName:获取)。
MTLFunctionConstant定义了以下属性。所需的属性指示必须始终提供常量或可以省略常量。当且仅当is_function_constant_defined引用函数中的常量时,常量值才是可选的。
@interface MTLFunctionConstant:NSObject
@property(readonly)NSString*name;
@property(readonly)MTLDataType type;
@property(readonly)NSUInteger index;
@property(readonly)BOOL required;
@end

Claims (20)

1.一种方法,包括:
生成着色器源代码模块的中间表示;
其中所述着色器源代码模块包括多个选项指示符,每个选项指示符指示所述着色器源代码模块中与启用或禁用所述着色器源代码模块中体现的多个特征中的一个相对应的位置,并且其中所述中间表示包括所述着色器源代码模块的编译版本,该编译版本包括与所述着色器源代码模块中的多个选项指示符中的每一个对应的编译的选项指示符;
接收针对GPU产生可执行代码的指示,其中所述可执行代码体现着色器源代码模块中表达的第一多个特征,并且所述可执行代码不体现在所述着色器源代码模块中表达的第二多个特征;
从所述中间表示生成所述可执行代码。
2.根据权利要求1所述的方法其中所述中间表示是.air文件。
3.根据权利要求1所述的方法其中产生可执行代码的所述指示是对所述可执行代码的运行时请求。
4.根据权利要求1所述的方法其中产生可执行代码的所述指示是应用程序模块启动。
5.根据权利要求1所述的方法其中选项指示符包括包含条件表达式的属性。
6.根据权利要求1所述的方法还包括:
查询数据资源以发现生成所述可执行代码所需的变量或常量值。
7.根据权利要求1所述的方法其中生成所述可执行代码包括编译所述中间表示。
8.一种非暂态程序存储设备,所述非暂态程序存储设备能够由处理器读取并且包括存储在其上的指令,以使得一个或多个处理器:
生成着色器源代码模块的中间表示;
其中所述着色器源代码模块包括多个选项指示符,每个选项指示符指示所述着色器源代码模块中与启用或禁用所述着色器源代码模块中体现的多个特征中的一个相对应的位置,并且其中所述中间表示包括所述着色器源代码模块的编译版本,该编译版本包括与所述着色器源代码模块中的多个选项指示符中的每一个对应的编译的选项指示符;
接收针对GPU产生可执行代码的指示,其中所述可执行代码体现着色器源代码模块中表达的第一多个特征,并且所述可执行代码不体现在所述着色器源代码模块中表达的第二多个特征;
从所述中间表示生成所述可执行代码。
9.根据权利要求8所述的非暂态程序存储设备其中产生可执行代码的所述指示是对所述可执行代码的运行时请求。
10.根据权利要求8所述的非暂态程序存储设备其中产生可执行代码的所述指示是应用程序模块启动。
11.根据权利要求8所述的非暂态程序存储设备其中选项指示符包括包含条件表达式的属性。
12.根据权利要求8所述的非暂态程序存储设备其中存储在其上的所述指令还使得所述一个或多个处理器:
查询数据资源以发现生成所述可执行代码所需的变量或常量值。
13.根据权利要求8所述的非暂态程序存储设备其中生成所述可执行代码包括编译所述中间表示。
14.根据权利要求8所述的非暂态程序存储设备其中所述中间表示是.air文件。
15.一种系统,包括:
一个或多个CPU;
一个或多个图形处理单元(GPU);
存储器,用于存储用于所述一个或多个CPU的程序指令,其中某些指令在被执行时使得所述一个或多个CPU:
生成着色器源代码模块的中间表示;
其中所述着色器源代码模块包括多个选项指示符,每个选项指示符指示所述着色器源代码模块中与启用或禁用所述着色器源代码模块中体现的多个特征中的一个相对应的位置,并且其中所述中间表示包括所述着色器源代码模块的编译版本,该编译版本包括与所述着色器源代码模块中的多个选项指示符中的每一个对应的编译的选项指示符;
接收针对所述一个或多个GPU产生可执行代码的指示,其中所述可执行代码体现着色器源代码模块中表达的第一多个特征,并且所述可执行代码不体现在所述着色器源代码模块中表达的第二多个特征;
从所述中间表示生成所述可执行代码。
16.根据权利要求8所述的系统其中产生可执行代码的所述指示是对所述可执行代码的运行时请求。
17.根据权利要求8所述的系统其中产生可执行代码的所述指示是应用程序模块启动。
18.根据权利要求8所述的系统其中选项指示符包括包含条件表达式的属性。
19.根据权利要求8所述的系统其中所述某些指令在被执行时还使得所述一个或多个CPU:
查询数据资源以发现生成所述可执行代码所需的变量或常量值。
20.根据权利要求8所述的系统其中生成所述可执行代码包括编译所述中间表示。
CN201680057224.3A 2015-09-30 2016-09-19 在不预处理宏的情况下使用Ubershader变体的系统和方法 Active CN108139897B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201562235502P 2015-09-30 2015-09-30
US62/235,502 2015-09-30
US15/244,668 2016-08-23
US15/244,668 US10180825B2 (en) 2015-09-30 2016-08-23 System and method for using ubershader variants without preprocessing macros
PCT/US2016/052413 WO2017058541A1 (en) 2015-09-30 2016-09-19 System and method for using ubershader variants without preprocessing macros

Publications (2)

Publication Number Publication Date
CN108139897A true CN108139897A (zh) 2018-06-08
CN108139897B CN108139897B (zh) 2021-08-17

Family

ID=58407300

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201680057224.3A Active CN108139897B (zh) 2015-09-30 2016-09-19 在不预处理宏的情况下使用Ubershader变体的系统和方法

Country Status (4)

Country Link
US (1) US10180825B2 (zh)
EP (1) EP3356932B1 (zh)
CN (1) CN108139897B (zh)
WO (1) WO2017058541A1 (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110865815A (zh) * 2019-11-12 2020-03-06 广州泳泳信息科技有限公司 一种shader语言多平台编译发布系统及方法
CN111831273A (zh) * 2019-04-30 2020-10-27 厦门雅基软件有限公司 基于着色器的数据处理方法、装置及电子设备
CN112256273A (zh) * 2020-10-20 2021-01-22 网易(杭州)网络有限公司 应用程序打包方法、装置及电子设备
CN117215592A (zh) * 2023-11-07 2023-12-12 芯瞳半导体技术(山东)有限公司 渲染程序生成方法、装置、电子设备和存储介质

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10180825B2 (en) * 2015-09-30 2019-01-15 Apple Inc. System and method for using ubershader variants without preprocessing macros
CN107885503B (zh) * 2017-11-11 2021-01-08 湖南大学 一种基于程序特征分析的迭代编译优化方法
CN109885310A (zh) * 2019-01-14 2019-06-14 珠海金山网络游戏科技有限公司 一种降低手机游戏Shader模块内存占用的方法及装置
CN110286940B (zh) * 2019-06-26 2022-03-25 四川长虹电器股份有限公司 智能电视日志生成方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110154307A1 (en) * 2009-12-17 2011-06-23 Eben Upton Method and System For Utilizing Data Flow Graphs to Compile Shaders
US20110202947A1 (en) * 2010-01-13 2011-08-18 Qualcomm Incorporated Optimized delivery of interactivity event assets in a mobile broadcast communication system
US20120159458A1 (en) * 2010-12-17 2012-06-21 Microsoft Corporation Reconstructing program control flow
CN103268626A (zh) * 2013-04-11 2013-08-28 江苏省在这里数字科技有限公司 基于gpu的地图线形符号绘制方法及系统
US20130339928A1 (en) * 2012-06-18 2013-12-19 Microsoft Corporation Adaptive portable libraries

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8296738B1 (en) * 2007-08-13 2012-10-23 Nvidia Corporation Methods and systems for in-place shader debugging and performance tuning
US8276129B1 (en) * 2007-08-13 2012-09-25 Nvidia Corporation Methods and systems for in-place shader debugging and performance tuning
US8189004B2 (en) * 2007-11-09 2012-05-29 Lucasfilm Entertainment Company Ltd. Translating Renderman shading language code
US8640097B2 (en) * 2009-03-16 2014-01-28 Microsoft Corporation Hosted application platform with extensible media format
US20100277488A1 (en) * 2009-04-30 2010-11-04 Kevin Myers Deferred Material Rasterization
US20110177775A1 (en) * 2010-01-13 2011-07-21 Qualcomm Incorporated Signaling mechanisms, templates and systems for creation and delivery of interactivity events on mobile devices in a mobile broadcast communication system
US8756590B2 (en) * 2010-06-22 2014-06-17 Microsoft Corporation Binding data parallel device source code
US20130271465A1 (en) * 2011-12-30 2013-10-17 Franz P. Clarberg Sort-Based Tiled Deferred Shading Architecture for Decoupled Sampling
US8806458B2 (en) * 2012-02-16 2014-08-12 Microsoft Corporation Vectorization of shaders
US9529575B2 (en) * 2012-02-16 2016-12-27 Microsoft Technology Licensing, Llc Rasterization of compute shaders
US9430199B2 (en) * 2012-02-16 2016-08-30 Microsoft Technology Licensing, Llc Scalar optimizations for shaders
US9740464B2 (en) * 2014-05-30 2017-08-22 Apple Inc. Unified intermediate representation
US9665370B2 (en) * 2014-08-19 2017-05-30 Qualcomm Incorporated Skipping of data storage
US10180825B2 (en) * 2015-09-30 2019-01-15 Apple Inc. System and method for using ubershader variants without preprocessing macros
US9799094B1 (en) * 2016-05-23 2017-10-24 Qualcomm Incorporated Per-instance preamble for graphics processing

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110154307A1 (en) * 2009-12-17 2011-06-23 Eben Upton Method and System For Utilizing Data Flow Graphs to Compile Shaders
US20110202947A1 (en) * 2010-01-13 2011-08-18 Qualcomm Incorporated Optimized delivery of interactivity event assets in a mobile broadcast communication system
US20120159458A1 (en) * 2010-12-17 2012-06-21 Microsoft Corporation Reconstructing program control flow
US20130339928A1 (en) * 2012-06-18 2013-12-19 Microsoft Corporation Adaptive portable libraries
CN103268626A (zh) * 2013-04-11 2013-08-28 江苏省在这里数字科技有限公司 基于gpu的地图线形符号绘制方法及系统

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111831273A (zh) * 2019-04-30 2020-10-27 厦门雅基软件有限公司 基于着色器的数据处理方法、装置及电子设备
CN111831273B (zh) * 2019-04-30 2022-10-28 厦门雅基软件有限公司 基于着色器的数据处理方法、装置及电子设备
CN110865815A (zh) * 2019-11-12 2020-03-06 广州泳泳信息科技有限公司 一种shader语言多平台编译发布系统及方法
CN112256273A (zh) * 2020-10-20 2021-01-22 网易(杭州)网络有限公司 应用程序打包方法、装置及电子设备
CN112256273B (zh) * 2020-10-20 2023-11-24 网易(杭州)网络有限公司 应用程序打包方法、装置及电子设备
CN117215592A (zh) * 2023-11-07 2023-12-12 芯瞳半导体技术(山东)有限公司 渲染程序生成方法、装置、电子设备和存储介质
CN117215592B (zh) * 2023-11-07 2024-02-20 芯瞳半导体技术(山东)有限公司 渲染程序生成方法、装置、电子设备和存储介质

Also Published As

Publication number Publication date
EP3356932B1 (en) 2022-04-13
US10180825B2 (en) 2019-01-15
CN108139897B (zh) 2021-08-17
WO2017058541A1 (en) 2017-04-06
US20170090886A1 (en) 2017-03-30
EP3356932A1 (en) 2018-08-08

Similar Documents

Publication Publication Date Title
CN108139897A (zh) 在不预处理宏的情况下使用Ubershader变体的系统和方法
US10534605B2 (en) Application system having a gaming engine that enables execution of a declarative language
CN106716361B (zh) 用于运行时例程冗余跟踪的编译器高速缓存
CN106415496A (zh) 统一中间表示
CN107771319B (zh) 封装图形库和硬件的图形引擎和环境
Sun et al. Evaluating performance tradeoffs on the radeon open compute platform
KR101962484B1 (ko) 확장 가능한 데이터 병렬 시맨틱스
CN106415492A (zh) 用于图形处理器单元上的图形和非图形计算的语言、函数库和编译器
CN107743636A (zh) 用于高效实时渲染预先不知道的图形的图形引擎和环境
CN102402451A (zh) 用户定义类型的编译时边界检查
Rautek et al. ViSlang: A system for interpreted domain-specific languages for scientific visualization
CN101965561A (zh) 用于异步方法的声明性支持
CN108986013A (zh) 间接参数缓冲区
US11573777B2 (en) Method and apparatus for enabling autonomous acceleration of dataflow AI applications
Goli Visioncpp: A sycl-based computer vision framework
CN115427960A (zh) 使用完全依存森林的关系提取
US9158536B2 (en) Program code library consolidation in an integrated development environment
Ketonen Examining performance benefits of real-world WebAssembly applications: a quantitative multiple-case study
JP7111309B2 (ja) 情報処理装置、学習装置、認識装置、静止画の生産方法、およびプログラム
US20240143296A1 (en) METHODS AND APPARATUS FOR COMBINING CODE LARGE LANGUAGE MODELS (LLMs) WITH COMPILERS
Szabó et al. Compiling C# Classes to Multiple Shader Sources for Multi-platform Real-Time Graphics
Reinders et al. Multithreading for visual effects
WO2024039923A1 (en) Method of compile-time optimization for nested parallel for-loops for deep learning neural network computation
CN115576604A (zh) 一种跨平台开发系统
Marburg et al. A machine vision extension to the Ruby programming language using OpenCV and FFI

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant