天天看點

Vulkan規範:第八章 8

8. 着色器

一個着色器指定了在圖形和計算管線對應各階段的每個頂點、控制點、細分頂點、圖元、片元或者工作組 上執行的可程式設計的操作。

圖形管線包括作為primitive assembly結果的頂點着色器執行, 緊接着是在patches之上的 細分控制、求值着色器(如果開啟了)操作,作用在圖元之上的幾何着色器(如果開啟了), 操作于 Rasterization産生的片元之上的片元着色器。 在本規範中,頂細分控制、細分求值、幾何着色器都是指頂點處理階段,發生在邏輯管線中栅格化之前。 片元着色器程式在栅格化之後運作。

隻有計算着色器階段被包含在計算管線中。計算着色器操作一個工作組中的一些調用。

着色器可以從輸入變量中讀取,從輸出變量中讀取或者寫入。 輸入和輸出變量可以被用來在不同着色器階段之間轉移資料,或者允許着色器和執行環境中變量值直接互動。 同樣的,執行環境也提供了描述性能的常量。

着色器變量和執行環境提供的着色器内部_built-in_修飾的輸入和輸出變量相關。 對于每個階段可用的修飾符在下面小節中列出。

8.1. 着色器子產品

Shader modules 包含 shader code 和一個或多個入口點。 可通過指定一個入口點作為建立pipeline的一部分來從着色器子產品中選擇着色器。 管線的階段可以使用來自不同子產品的着色器。定義了一個着色器子產品的着色器代碼必須是SPIR-V格式, 在附錄 Vulkan Environment for SPIR-V 有描述。

着色器子產品通過

VkShaderModule

 handles表示:

VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule)
           

可調用如下指令來建立着色器子產品:

VkResult vkCreateShaderModule(
    VkDevice                                    device,
    const VkShaderModuleCreateInfo*             pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkShaderModule*                             pShaderModule);
           
  • device

     是建立着色器子產品的邏輯裝置。
  • pCreateInfo

     參數是一個指針,指向了一個 

    VkShaderModuleCreateInfo

     類型的資料結構執行個體。
  • pAllocator

    控制了主機端記憶體如何配置設定,如Memory Allocation一章所述。
  • pShaderModule

     指向了一個

    VkShaderModule

     handle ,它接收傳回的着色器子產品。

一旦着色器子產品被建立完成,它所包含的入口點在Compute Pipelines 和 Graphics Pipelines中描述的管線階段。

Valid Usage (Implicit)

  • device

     must be a valid 

    VkDevice

     handle
  • pCreateInfo

     must be a pointer to a valid 

    VkShaderModuleCreateInfo

     structure
  • If 

    pAllocator

     is not 

    NULL

    pAllocator

     must be a pointer to a valid 

    VkAllocationCallbacks

     structure
  • pShaderModule

     must be a pointer to a 

    VkShaderModule

     handle

Return Codes

Success
  • VK_SUCCESS

Failure
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkShaderModuleCreateInfo

 資料結構定義如下:

typedef struct VkShaderModuleCreateInfo {
    VkStructureType              sType;
    const void*                  pNext;
    VkShaderModuleCreateFlags    flags;
    size_t                       codeSize;
    const uint32_t*              pCode;
} VkShaderModuleCreateInfo;
           
  • sType

     是資料結構的類型
  • pNext

     是 

    NULL

     或者指向一個指向拓展特定的資料結構的指針
  • flags

     被保留
  • codeSize

     是 

    pCode

    指明的代碼的大小,以位元組為機關
  • pCode

     指向了将用來建立着色器子產品的代碼。代碼的類型和格式由 

    pCode

    所指向的記憶體内容所決定

正确使用

  • codeSize

     必須要大于0
  • codeSize

     必須是4的倍數 If the VK_NV_glsl_shader extension is enabled and 

    pCode

     references GLSL code 

    codeSize

    can be a multiple of 1
  • pCode

     must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification. If the VK_NV_glsl_shader extension is enabled 

    pCode

     can instead reference valid GLSL code and must be written to the GL_KHR_vulkan_glsl extension specification
  • pCode

     must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix. If the VK_NV_glsl_shader extension is enabled 

    pCode

     can be valid GLSL code with respect to the GL_KHR_vulkan_glsl GLSL extension specification
  • pCode

     must declare the 

    Shader

     capability for SPIR-V code
  • pCode

     must not declare any capability that is not supported by the API, as described by the Capabilities section of the SPIR-V Environment appendix
  • If 

    pCode

     declares any of the capabilities that are listed as not required by the implementation, the relevant feature mustbe enabled, as listed in the SPIR-V Environment appendix

Valid Usage (Implicit)

  • sType

     must be 

    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO

  • pNext

     must be 

    NULL

  • flags

     must be 
  • pCode

     must be a pointer to an array of \(codeSize \over 4\) 

    uint32_t

     values

可調用如下指令來銷毀着色器子產品:

void vkDestroyShaderModule(
    VkDevice                                    device,
    VkShaderModule                              shaderModule,
    const VkAllocationCallbacks*                pAllocator);
           
  • device

     是銷毀着色器子產品的邏輯裝置
  • shaderModule

     是需要被銷毀的着色器子產品
  • pAllocator

     控制了CPU端記憶體配置設定,如 Memory Allocation 一章所述

一個着色器子產品可以在使用它的着色器的管線仍在使用中的時候被銷毀。

正确使用

  • If 

    VkAllocationCallbacks

     were provided when 

    shaderModule

     was created, a compatible set of callbacks must be provided here
  • If no 

    VkAllocationCallbacks

     were provided when 

    shaderModule

     was created, 

    pAllocator

     must be 

    NULL

Valid Usage (Implicit)

  • device

     must be a valid 

    VkDevice

     handle
  • If 

    shaderModule

     is not 

    VK_NULL_HANDLE

    shaderModule

     must be a valid 

    VkShaderModule

     handle
  • If 

    pAllocator

     is not 

    NULL

    pAllocator

     must be a pointer to a valid 

    VkAllocationCallbacks

     structure
  • If 

    shaderModule

     is a valid handle, it must have been created, allocated, or retrieved from 

    device

Host Synchronization

  • Host access to 

    shaderModule

     must be externally synchronized

繼續閱讀