Hgi Class Referenceabstract

Hydra Graphics Interface. More...

+ Inheritance diagram for Hgi:

Public Member Functions

HGI_API void SubmitCmds (HgiCmds *cmds, HgiSubmitWaitType wait=HgiSubmitWaitTypeNoWait)
 Submit one HgiCmds objects. More...
 
virtual HGI_API bool IsBackendSupported () const =0
 Determine if Hgi instance can run on current hardware. More...
 
virtual HGI_API HgiGraphicsCmdsUniquePtr CreateGraphicsCmds (HgiGraphicsCmdsDesc const &desc)=0
 Returns a GraphicsCmds object (for temporary use) that is ready to record draw commands. More...
 
virtual HGI_API HgiBlitCmdsUniquePtr CreateBlitCmds ()=0
 Returns a BlitCmds object (for temporary use) that is ready to execute resource copy commands. More...
 
virtual HGI_API HgiComputeCmdsUniquePtr CreateComputeCmds ()=0
 Returns a ComputeCmds object (for temporary use) that is ready to record dispatch commands. More...
 
virtual HGI_API HgiTextureHandle CreateTexture (HgiTextureDesc const &desc)=0
 Create a texture in rendering backend. More...
 
virtual HGI_API void DestroyTexture (HgiTextureHandle *texHandle)=0
 Destroy a texture in rendering backend. More...
 
virtual HGI_API HgiTextureViewHandle CreateTextureView (HgiTextureViewDesc const &desc)=0
 Create a texture view in rendering backend. More...
 
virtual HGI_API void DestroyTextureView (HgiTextureViewHandle *viewHandle)=0
 Destroy a texture view in rendering backend. More...
 
virtual HGI_API HgiSamplerHandle CreateSampler (HgiSamplerDesc const &desc)=0
 Create a sampler in rendering backend. More...
 
virtual HGI_API void DestroySampler (HgiSamplerHandle *smpHandle)=0
 Destroy a sampler in rendering backend. More...
 
virtual HGI_API HgiBufferHandle CreateBuffer (HgiBufferDesc const &desc)=0
 Create a buffer in rendering backend. More...
 
virtual HGI_API void DestroyBuffer (HgiBufferHandle *bufHandle)=0
 Destroy a buffer in rendering backend. More...
 
virtual HGI_API HgiShaderFunctionHandle CreateShaderFunction (HgiShaderFunctionDesc const &desc)=0
 Create a new shader function. More...
 
virtual HGI_API void DestroyShaderFunction (HgiShaderFunctionHandle *shaderFunctionHandle)=0
 Destroy a shader function. More...
 
virtual HGI_API HgiShaderProgramHandle CreateShaderProgram (HgiShaderProgramDesc const &desc)=0
 Create a new shader program. More...
 
virtual HGI_API void DestroyShaderProgram (HgiShaderProgramHandle *shaderProgramHandle)=0
 Destroy a shader program. More...
 
virtual HGI_API HgiResourceBindingsHandle CreateResourceBindings (HgiResourceBindingsDesc const &desc)=0
 Create a new resource binding object. More...
 
virtual HGI_API void DestroyResourceBindings (HgiResourceBindingsHandle *resHandle)=0
 Destroy a resource binding object. More...
 
virtual HGI_API HgiGraphicsPipelineHandle CreateGraphicsPipeline (HgiGraphicsPipelineDesc const &pipeDesc)=0
 Create a new graphics pipeline state object. More...
 
virtual HGI_API void DestroyGraphicsPipeline (HgiGraphicsPipelineHandle *pipeHandle)=0
 Destroy a graphics pipeline state object. More...
 
virtual HGI_API HgiComputePipelineHandle CreateComputePipeline (HgiComputePipelineDesc const &pipeDesc)=0
 Create a new compute pipeline state object. More...
 
virtual HGI_API void DestroyComputePipeline (HgiComputePipelineHandle *pipeHandle)=0
 Destroy a compute pipeline state object. More...
 
virtual HGI_API TfToken const & GetAPIName () const =0
 Return the name of the api (e.g. More...
 
virtual HGI_API HgiCapabilities const * GetCapabilities () const =0
 Returns the device-specific capabilities structure. More...
 
virtual HGI_API HgiIndirectCommandEncoderGetIndirectCommandEncoder () const =0
 Returns the device-specific indirect command buffer encoder or nullptr if not supported. More...
 
virtual HGI_API void StartFrame ()=0
 Optionally called by client app at the start of a new rendering frame. More...
 
virtual HGI_API void EndFrame ()=0
 Optionally called at the end of a rendering frame. More...
 

Static Public Member Functions

static HGI_API HgiGetPlatformDefaultHgi ()
 *** DEPRECATED *** Please use: CreatePlatformDefaultHgi More...
 
static HGI_API HgiUniquePtr CreatePlatformDefaultHgi ()
 Helper function to return a Hgi object for the current platform. More...
 
static HGI_API bool IsSupported ()
 Constructs a temporary Hgi object for the current platform and calls the object's IsBackendSupported() function. More...
 

Protected Member Functions

HGI_API uint64_t GetUniqueId ()
 
virtual HGI_API bool _SubmitCmds (HgiCmds *cmds, HgiSubmitWaitType wait)
 

Detailed Description

Hydra Graphics Interface.

Hgi is used to communicate with one or more physical gpu devices.

Hgi provides API to create/destroy resources that a gpu device owns. The lifetime of resources is not managed by Hgi, so it is up to the caller to destroy resources and ensure those resources are no longer used.

Commands are recorded in 'HgiCmds' objects and submitted via Hgi.

Thread-safety:

Modern graphics APIs like Metal and Vulkan are designed with multi-threading in mind. We want to try and take advantage of this where possible. However we also wish to continue to support OpenGL for the time being.

In an application where OpenGL is involved, when we say "main thread" we mean the thread on which the gl-context is bound.

Each Hgi backend should at minimum support the following:

  • Single threaded Hgi::SubmitCmds on main thread.
  • Single threaded Hgi::Resource Create*** / Destroy*** on main thread.
  • Multi threaded recording of commands in Hgi***Cmds objects.
  • A Hgi***Cmds object should be creatable on the main thread, recorded into with one secondary thread (only one thread may use a Cmds object) and submitted via the main thread.

Each Hgi backend is additionally encouraged to support:

  • Multi threaded support for resource creation and destruction.

We currently do not rely on these additional multi-threading features in Hydra / Storm where we still wish to run OpenGL. In Hydra we make sure to use the main-thread for resource creation and command submission. One day we may wish to switch this to be multi-threaded so new Hgi backends are encouraged to support it.

Pseudo code what should minimally be supported:

vector<HgiGraphicsCmds> cmds

for num_threads
    cmds.push_back( Hgi->CreateGraphicsCmds() )

parallel_for i to num_threads
    cmds[i]->SetViewport()
    cmds[i]->Draw()

for i to num_threads
    hgi->SubmitCmds( cmds[i] )

Definition at line 109 of file hgi.h.

Member Function Documentation

◆ CreateBlitCmds()

virtual HGI_API HgiBlitCmdsUniquePtr CreateBlitCmds ( )
pure virtual

Returns a BlitCmds object (for temporary use) that is ready to execute resource copy commands.

BlitCmds is a lightweight object that should be re-acquired each frame (don't hold onto it after EndEncoding). Thread safety: Each Hgi backend must ensure that a Cmds object can be created on the main thread, recorded into (exclusively) by one secondary thread and be submitted on the main thread. See notes above.

Implemented in HgiGL.

◆ CreateBuffer()

virtual HGI_API HgiBufferHandle CreateBuffer ( HgiBufferDesc const &  desc)
pure virtual

Create a buffer in rendering backend.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateComputeCmds()

virtual HGI_API HgiComputeCmdsUniquePtr CreateComputeCmds ( )
pure virtual

Returns a ComputeCmds object (for temporary use) that is ready to record dispatch commands.

ComputeCmds is a lightweight object that should be re-acquired each frame (don't hold onto it after EndEncoding). Thread safety: Each Hgi backend must ensure that a Cmds object can be created on the main thread, recorded into (exclusively) by one secondary thread and be submitted on the main thread. See notes above.

Implemented in HgiGL.

◆ CreateComputePipeline()

virtual HGI_API HgiComputePipelineHandle CreateComputePipeline ( HgiComputePipelineDesc const &  pipeDesc)
pure virtual

Create a new compute pipeline state object.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateGraphicsCmds()

virtual HGI_API HgiGraphicsCmdsUniquePtr CreateGraphicsCmds ( HgiGraphicsCmdsDesc const &  desc)
pure virtual

Returns a GraphicsCmds object (for temporary use) that is ready to record draw commands.

GraphicsCmds is a lightweight object that should be re-acquired each frame (don't hold onto it after EndEncoding). Thread safety: Each Hgi backend must ensure that a Cmds object can be created on the main thread, recorded into (exclusively) by one secondary thread and be submitted on the main thread. See notes above.

Implemented in HgiGL.

◆ CreateGraphicsPipeline()

virtual HGI_API HgiGraphicsPipelineHandle CreateGraphicsPipeline ( HgiGraphicsPipelineDesc const &  pipeDesc)
pure virtual

Create a new graphics pipeline state object.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreatePlatformDefaultHgi()

static HGI_API HgiUniquePtr CreatePlatformDefaultHgi ( )
static

Helper function to return a Hgi object for the current platform.

For example on Linux this may return HgiGL while on macOS HgiMetal. Caller, usually the application, owns the lifetime of the Hgi object and the object is destroyed when the caller drops the unique ptr. Thread safety: Not thread safe.

◆ CreateResourceBindings()

virtual HGI_API HgiResourceBindingsHandle CreateResourceBindings ( HgiResourceBindingsDesc const &  desc)
pure virtual

Create a new resource binding object.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateSampler()

virtual HGI_API HgiSamplerHandle CreateSampler ( HgiSamplerDesc const &  desc)
pure virtual

Create a sampler in rendering backend.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateShaderFunction()

virtual HGI_API HgiShaderFunctionHandle CreateShaderFunction ( HgiShaderFunctionDesc const &  desc)
pure virtual

Create a new shader function.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateShaderProgram()

virtual HGI_API HgiShaderProgramHandle CreateShaderProgram ( HgiShaderProgramDesc const &  desc)
pure virtual

Create a new shader program.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateTexture()

virtual HGI_API HgiTextureHandle CreateTexture ( HgiTextureDesc const &  desc)
pure virtual

Create a texture in rendering backend.

Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ CreateTextureView()

virtual HGI_API HgiTextureViewHandle CreateTextureView ( HgiTextureViewDesc const &  desc)
pure virtual

Create a texture view in rendering backend.

A texture view aliases another texture's data. It is the responsibility of the client to ensure that the sourceTexture is not destroyed while the texture view is in use. Thread safety: Creation must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyBuffer()

virtual HGI_API void DestroyBuffer ( HgiBufferHandle bufHandle)
pure virtual

Destroy a buffer in rendering backend.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyComputePipeline()

virtual HGI_API void DestroyComputePipeline ( HgiComputePipelineHandle pipeHandle)
pure virtual

Destroy a compute pipeline state object.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyGraphicsPipeline()

virtual HGI_API void DestroyGraphicsPipeline ( HgiGraphicsPipelineHandle pipeHandle)
pure virtual

Destroy a graphics pipeline state object.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyResourceBindings()

virtual HGI_API void DestroyResourceBindings ( HgiResourceBindingsHandle resHandle)
pure virtual

Destroy a resource binding object.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroySampler()

virtual HGI_API void DestroySampler ( HgiSamplerHandle smpHandle)
pure virtual

Destroy a sampler in rendering backend.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyShaderFunction()

virtual HGI_API void DestroyShaderFunction ( HgiShaderFunctionHandle shaderFunctionHandle)
pure virtual

Destroy a shader function.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyShaderProgram()

virtual HGI_API void DestroyShaderProgram ( HgiShaderProgramHandle shaderProgramHandle)
pure virtual

Destroy a shader program.

Note that this does NOT automatically destroy the shader functions in the program since shader functions may be used by more than one program. Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyTexture()

virtual HGI_API void DestroyTexture ( HgiTextureHandle *  texHandle)
pure virtual

Destroy a texture in rendering backend.

Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ DestroyTextureView()

virtual HGI_API void DestroyTextureView ( HgiTextureViewHandle viewHandle)
pure virtual

Destroy a texture view in rendering backend.

This will destroy the view's texture, but not the sourceTexture that was aliased by the view. The sourceTexture data remains unchanged. Thread safety: Destruction must happen on main thread. See notes above.

Implemented in HgiGL.

◆ EndFrame()

virtual HGI_API void EndFrame ( )
pure virtual

Optionally called at the end of a rendering frame.

Please read the comments in StartFrame. Thread safety: Not thread safe. Should be called on the main thread.

Implemented in HgiGL.

◆ GetAPIName()

virtual HGI_API TfToken const& GetAPIName ( ) const
pure virtual

Return the name of the api (e.g.

"OpenGL"). Thread safety: This call is thread safe.

Implemented in HgiGL.

◆ GetCapabilities()

virtual HGI_API HgiCapabilities const* GetCapabilities ( ) const
pure virtual

Returns the device-specific capabilities structure.

Thread safety: This call is thread safe.

Implemented in HgiGL.

◆ GetIndirectCommandEncoder()

virtual HGI_API HgiIndirectCommandEncoder* GetIndirectCommandEncoder ( ) const
pure virtual

Returns the device-specific indirect command buffer encoder or nullptr if not supported.

Thread safety: This call is thread safe.

Implemented in HgiGL.

◆ GetPlatformDefaultHgi()

static HGI_API Hgi* GetPlatformDefaultHgi ( )
static

*** DEPRECATED *** Please use: CreatePlatformDefaultHgi

◆ IsBackendSupported()

virtual HGI_API bool IsBackendSupported ( ) const
pure virtual

Determine if Hgi instance can run on current hardware.

Thread safety: This call is thread safe.

Implemented in HgiGL.

◆ IsSupported()

static HGI_API bool IsSupported ( )
static

Constructs a temporary Hgi object for the current platform and calls the object's IsBackendSupported() function.

Thread safety: Not thread safe.

◆ StartFrame()

virtual HGI_API void StartFrame ( )
pure virtual

Optionally called by client app at the start of a new rendering frame.

We can't rely on StartFrame for anything important, because it is up to the external client to (optionally) call this and they may never do. Hydra doesn't have a clearly defined start or end frame. This can be helpful to insert GPU frame debug markers. Thread safety: Not thread safe. Should be called on the main thread.

Implemented in HgiGL.

◆ SubmitCmds()

HGI_API void SubmitCmds ( HgiCmds cmds,
HgiSubmitWaitType  wait = HgiSubmitWaitTypeNoWait 
)

Submit one HgiCmds objects.

Once the cmds object is submitted it cannot be re-used to record cmds. A call to SubmitCmds would usually result in the hgi backend submitting the cmd buffers of the cmds object(s) to the device queue. Derived classes can override _SubmitCmds to customize submission. Thread safety: This call is not thread-safe. Submission must happen on the main thread so we can continue to support the OpenGL platform. See notes above.


The documentation for this class was generated from the following file: