Blender V5.0
blender::gpu::shader::ShaderCreateInfo Struct Reference

Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correctly provided, this is all that is needed to create and compile a blender::gpu::Shader. More...

#include <gpu_shader_create_info.hh>

Inherited by blender::gpu::shader::GPUCodegenCreateInfo.

Classes

struct  ResourceString
struct  VertIn
struct  GeometryStageLayout
struct  ComputeStageLayout
struct  FragOut
struct  SubpassIn
struct  SharedVariable
struct  Sampler
struct  Image
struct  UniformBuf
struct  StorageBuf
struct  Resource
struct  PushConst

Public Types

using Self = ShaderCreateInfo

Public Member Functions

Vector< Resource > & resources_get_ (Frequency freq)
Vector< Resourceresources_get_all_ () const
 ShaderCreateInfo (const char *name)
 ~ShaderCreateInfo ()=default
Shaders in/outs (fixed function pipeline config)
Selfvertex_in (int slot, Type type, StringRefNull name)
Selfvertex_out (StageInterfaceInfo &interface)
Selfgeometry_layout (PrimitiveIn prim_in, PrimitiveOut prim_out, int max_vertices, int invocations=-1)
Selflocal_group_size (int local_size_x, int local_size_y=1, int local_size_z=1)
Selfearly_fragment_test (bool enable)
Selfgeometry_out (StageInterfaceInfo &interface)
Selffragment_out (int slot, Type type, StringRefNull name, DualBlend blend=DualBlend::NONE, int raster_order_group=-1)
Selfsubpass_in (int slot, Type type, ImageType img_type, StringRefNull name, int raster_order_group=-1)
Selfshared_resource_descriptor (void(*fn)(ShaderCreateInfo &))
Shader compilation constants

Compilation constants are constants defined in the create info. They cannot be changed after the shader is created. It is a replacement to macros with added type safety.

Selfcompilation_constant (Type type, StringRefNull name, double default_value)
Shader specialization constants
Selfspecialization_constant (Type type, StringRefNull name, double default_value)
Compute shader Shared variables
Selfshared_variable (Type type, StringRefNull name)
Resources bindings points
Selfuniform_buf (int slot, StringRefNull type_name, StringRefNull name, Frequency freq=Frequency::PASS)
Selfstorage_buf (int slot, Qualifier qualifiers, StringRefNull type_name, StringRefNull name, Frequency freq=Frequency::PASS)
Selfimage (int slot, TextureFormat format, Qualifier qualifiers, ImageReadWriteType type, StringRefNull name, Frequency freq=Frequency::PASS)
Selfsampler (int slot, ImageType type, StringRefNull name, Frequency freq=Frequency::PASS, GPUSamplerState sampler=GPUSamplerState::internal_sampler())
Shader Source
Selfvertex_source (StringRefNull filename)
Selffragment_source (StringRefNull filename)
Selfcompute_source (StringRefNull filename)
Selfvertex_function (StringRefNull function_name)
Selffragment_function (StringRefNull function_name)
Selfcompute_function (StringRefNull function_name)
Push constants

Data managed by blender::gpu::Shader. Can be set through uniform functions. Must be less than 128bytes.

Selfpush_constant (Type type, StringRefNull name, int array_size=0)
Defines
Selfdefine (StringRefNull name, StringRefNull value="")
Selfdo_static_compilation (bool value)
Selfbuiltins (BuiltinBits builtin)
Selfdepth_write (DepthWrite value)
Selfauto_resource_location (bool value)
Selfmetal_backend_only (bool flag)
Additional Create Info

Used to share parts of the infos that are common to many shaders.

Selfadditional_info (StringRefNull info_name)
template<typename... Args>
Selfadditional_info (StringRefNull info_name, Args... args)
Typedef Sources

Some resource declarations might need some special structure defined. Adding a file using typedef_source will include it before the resource and interface definitions.

Selftypedef_source (StringRefNull filename)
mtl_max_total_threads_per_threadgroup

max_total_threads_per_threadgroup - Provides compiler hint for maximum threadgroup size up front. Maximum value is 1024.

Selfmtl_max_total_threads_per_threadgroup (ushort max_total_threads_per_threadgroup)
Recursive evaluation.

Flatten all dependency so that this descriptor contains all the data from the additional descriptors. This avoids tedious traversal in shader source creation.

void finalize (const bool recursive=false)
void resource_guard_defines (std::string &defines) const
std::string check_error () const
bool is_vulkan_compatible () const
void validate_merge (const ShaderCreateInfo &other_info)
void validate_vertex_attributes (const ShaderCreateInfo *other_info=nullptr)

Public Attributes

StringRefNull name_
bool do_static_compilation_ = false
bool is_generated_ = true
bool finalized_ = false
bool auto_resource_location_ = false
bool early_fragment_test_ = false
DepthWrite depth_write_ = DepthWrite::UNCHANGED
bool metal_backend_only_ = false
size_t interface_names_size_ = 0
BuiltinBits builtins_ = BuiltinBits::NONE
std::string vertex_source_generated
std::string fragment_source_generated
std::string compute_source_generated
std::string geometry_source_generated
std::string typedef_source_generated
Vector< StringRefNull, 0 > dependencies_generated
GeneratedSourceList generated_sources
Vector< VertInvertex_inputs_
GeometryStageLayout geometry_layout_
ComputeStageLayout compute_layout_
Vector< FragOutfragment_outputs_
Vector< SubpassInsubpass_inputs_
Vector< CompilationConstant, 0 > compilation_constants_
Vector< SpecializationConstantspecialization_constants_
Vector< SharedVariable, 0 > shared_variables_
Vector< Resourcepass_resources_
Vector< Resourcebatch_resources_
Vector< Resourcegeometry_resources_
Vector< StageInterfaceInfo * > vertex_out_interfaces_
Vector< StageInterfaceInfo * > geometry_out_interfaces_
Vector< PushConstpush_constants_
Vector< StringRefNulltypedef_sources_
StringRefNull vertex_source_
StringRefNull geometry_source_
StringRefNull fragment_source_
StringRefNull compute_source_
StringRefNull vertex_entry_fn_ = "main"
StringRefNull geometry_entry_fn_ = "main"
StringRefNull fragment_entry_fn_ = "main"
StringRefNull compute_entry_fn_ = "main"
Vector< std::array< StringRefNull, 2 > > defines_
Vector< StringRefNulladditional_infos_

Operators.

bool operator== (const ShaderCreateInfo &b) const
bool has_resource_type (Resource::BindType bind_type) const
bool has_resource_image () const
std::ostream & operator<< (std::ostream &stream, const ShaderCreateInfo &info)

Detailed Description

Describe inputs & outputs, stage interfaces, resources and sources of a shader. If all data is correctly provided, this is all that is needed to create and compile a blender::gpu::Shader.

IMPORTANT: All strings are references only. Make sure all the strings used by a ShaderCreateInfo are not freed until it is consumed or deleted.

Definition at line 686 of file gpu_shader_create_info.hh.

Member Typedef Documentation

◆ Self

Constructor & Destructor Documentation

◆ ShaderCreateInfo()

blender::gpu::shader::ShaderCreateInfo::ShaderCreateInfo ( const char * name)
inline

◆ ~ShaderCreateInfo()

blender::gpu::shader::ShaderCreateInfo::~ShaderCreateInfo ( )
default

Member Function Documentation

◆ additional_info() [1/2]

Self & blender::gpu::shader::ShaderCreateInfo::additional_info ( StringRefNull info_name)
inline

◆ additional_info() [2/2]

template<typename... Args>
Self & blender::gpu::shader::ShaderCreateInfo::additional_info ( StringRefNull info_name,
Args... args )
inline

Definition at line 1401 of file gpu_shader_create_info.hh.

References additional_info().

◆ auto_resource_location()

Self & blender::gpu::shader::ShaderCreateInfo::auto_resource_location ( bool value)
inline

Definition at line 1375 of file gpu_shader_create_info.hh.

References auto_resource_location_.

◆ builtins()

Self & blender::gpu::shader::ShaderCreateInfo::builtins ( BuiltinBits builtin)
inline

◆ check_error()

◆ compilation_constant()

◆ compute_function()

Self & blender::gpu::shader::ShaderCreateInfo::compute_function ( StringRefNull function_name)
inline

Definition at line 1311 of file gpu_shader_create_info.hh.

References compute_entry_fn_.

◆ compute_source()

Self & blender::gpu::shader::ShaderCreateInfo::compute_source ( StringRefNull filename)
inline

Definition at line 1293 of file gpu_shader_create_info.hh.

References compute_source_.

Referenced by pygpu_shader_info_compute_source().

◆ define()

Self & blender::gpu::shader::ShaderCreateInfo::define ( StringRefNull name,
StringRefNull value = "" )
inline

◆ depth_write()

Self & blender::gpu::shader::ShaderCreateInfo::depth_write ( DepthWrite value)
inline

Definition at line 1369 of file gpu_shader_create_info.hh.

References depth_write_.

Referenced by pygpu_shader_info_depth_write().

◆ do_static_compilation()

Self & blender::gpu::shader::ShaderCreateInfo::do_static_compilation ( bool value)
inline

Definition at line 1356 of file gpu_shader_create_info.hh.

References do_static_compilation_.

◆ early_fragment_test()

Self & blender::gpu::shader::ShaderCreateInfo::early_fragment_test ( bool enable)
inline

Force fragment tests before fragment shader invocation. IMPORTANT: This is incompatible with using the gl_FragDepth output.

Definition at line 1051 of file gpu_shader_create_info.hh.

References early_fragment_test_.

◆ finalize()

◆ fragment_function()

Self & blender::gpu::shader::ShaderCreateInfo::fragment_function ( StringRefNull function_name)
inline

Definition at line 1305 of file gpu_shader_create_info.hh.

References fragment_entry_fn_.

◆ fragment_out()

Self & blender::gpu::shader::ShaderCreateInfo::fragment_out ( int slot,
Type type,
StringRefNull name,
DualBlend blend = DualBlend::NONE,
int raster_order_group = -1 )
inline

◆ fragment_source()

◆ geometry_layout()

Self & blender::gpu::shader::ShaderCreateInfo::geometry_layout ( PrimitiveIn prim_in,
PrimitiveOut prim_out,
int max_vertices,
int invocations = -1 )
inline

Definition at line 1027 of file gpu_shader_create_info.hh.

References geometry_layout_.

◆ geometry_out()

Self & blender::gpu::shader::ShaderCreateInfo::geometry_out ( StageInterfaceInfo & interface)
inline

Only needed if geometry shader is enabled. IMPORTANT: Input and output instance name will have respectively "_in" and "_out" suffix appended in the geometry shader IF AND ONLY IF the vertex_out interface instance name matches the geometry_out interface instance name.

Definition at line 1063 of file gpu_shader_create_info.hh.

References geometry_out_interfaces_.

◆ has_resource_image()

bool blender::gpu::shader::ShaderCreateInfo::has_resource_image ( ) const
inline

◆ has_resource_type()

bool blender::gpu::shader::ShaderCreateInfo::has_resource_type ( Resource::BindType bind_type) const
inline

Definition at line 1546 of file gpu_shader_create_info.hh.

References batch_resources_, geometry_resources_, and pass_resources_.

Referenced by has_resource_image().

◆ image()

◆ is_vulkan_compatible()

bool blender::gpu::shader::ShaderCreateInfo::is_vulkan_compatible ( ) const

◆ local_group_size()

Self & blender::gpu::shader::ShaderCreateInfo::local_group_size ( int local_size_x,
int local_size_y = 1,
int local_size_z = 1 )
inline

Definition at line 1039 of file gpu_shader_create_info.hh.

References compute_layout_.

Referenced by pygpu_shader_info_local_group_size().

◆ metal_backend_only()

Self & blender::gpu::shader::ShaderCreateInfo::metal_backend_only ( bool flag)
inline

Definition at line 1381 of file gpu_shader_create_info.hh.

References flag, and metal_backend_only_.

◆ mtl_max_total_threads_per_threadgroup()

Self & blender::gpu::shader::ShaderCreateInfo::mtl_max_total_threads_per_threadgroup ( ushort max_total_threads_per_threadgroup)
inline

Definition at line 1439 of file gpu_shader_create_info.hh.

References UNUSED_VARS.

◆ operator==()

◆ push_constant()

Self & blender::gpu::shader::ShaderCreateInfo::push_constant ( Type type,
StringRefNull name,
int array_size = 0 )
inline

◆ resource_guard_defines()

void blender::gpu::shader::ShaderCreateInfo::resource_guard_defines ( std::string & defines) const

◆ resources_get_()

◆ resources_get_all_()

◆ sampler()

◆ shared_resource_descriptor()

Self & blender::gpu::shader::ShaderCreateInfo::shared_resource_descriptor ( void(* fn )(ShaderCreateInfo &))
inline

Definition at line 1100 of file gpu_shader_create_info.hh.

References ShaderCreateInfo().

◆ shared_variable()

Self & blender::gpu::shader::ShaderCreateInfo::shared_variable ( Type type,
StringRefNull name )
inline

Definition at line 1201 of file gpu_shader_create_info.hh.

References name, and shared_variables_.

◆ specialization_constant()

◆ storage_buf()

◆ subpass_in()

Self & blender::gpu::shader::ShaderCreateInfo::subpass_in ( int slot,
Type type,
ImageType img_type,
StringRefNull name,
int raster_order_group = -1 )
inline

Allows to fetch frame-buffer values from previous render sub-pass.

On Apple Silicon, the additional raster_order_group is there to set the sub-pass dependencies. Any sub-pass input need to have the same raster_order_group defined in the shader writing them.

IMPORTANT: Currently emulated on all backend except Metal. This is only for debugging purpose as it is too slow to be viable.

TODO(fclem): Vulkan can implement that using subpassInput. However sub-pass boundaries might be difficult to inject implicitly and will require more high level changes. TODO(fclem): OpenGL can emulate that using GL_EXT_shader_framebuffer_fetch.

Definition at line 1093 of file gpu_shader_create_info.hh.

References name, and subpass_inputs_.

Referenced by blender::gpu::tests::test_framebuffer_subpass_input().

◆ typedef_source()

Self & blender::gpu::shader::ShaderCreateInfo::typedef_source ( StringRefNull filename)
inline

Definition at line 1418 of file gpu_shader_create_info.hh.

References typedef_sources_.

Referenced by pygpu_shader_info_typedef_source().

◆ uniform_buf()

◆ validate_merge()

◆ validate_vertex_attributes()

void blender::gpu::shader::ShaderCreateInfo::validate_vertex_attributes ( const ShaderCreateInfo * other_info = nullptr)

◆ vertex_function()

Self & blender::gpu::shader::ShaderCreateInfo::vertex_function ( StringRefNull function_name)
inline

Definition at line 1299 of file gpu_shader_create_info.hh.

References vertex_entry_fn_.

◆ vertex_in()

Self & blender::gpu::shader::ShaderCreateInfo::vertex_in ( int slot,
Type type,
StringRefNull name )
inline

◆ vertex_out()

Self & blender::gpu::shader::ShaderCreateInfo::vertex_out ( StageInterfaceInfo & interface)
inline

◆ vertex_source()

Self & blender::gpu::shader::ShaderCreateInfo::vertex_source ( StringRefNull filename)
inline

◆ operator<<

Member Data Documentation

◆ additional_infos_

Vector<StringRefNull> blender::gpu::shader::ShaderCreateInfo::additional_infos_

Name of other infos to recursively merge with this one. No data slot must overlap otherwise we throw an error.

Definition at line 997 of file gpu_shader_create_info.hh.

Referenced by additional_info(), finalize(), operator==(), and resource_guard_defines().

◆ auto_resource_location_

bool blender::gpu::shader::ShaderCreateInfo::auto_resource_location_ = false

If true, all resources will have an automatic location assigned.

Definition at line 696 of file gpu_shader_create_info.hh.

Referenced by auto_resource_location(), finalize(), blender::gpu::GLShader::resources_declare(), and validate_merge().

◆ batch_resources_

◆ builtins_

◆ compilation_constants_

◆ compute_entry_fn_

StringRefNull blender::gpu::shader::ShaderCreateInfo::compute_entry_fn_ = "main"

◆ compute_layout_

◆ compute_source_

◆ compute_source_generated

std::string blender::gpu::shader::ShaderCreateInfo::compute_source_generated

◆ defines_

Vector<std::array<StringRefNull, 2> > blender::gpu::shader::ShaderCreateInfo::defines_

◆ dependencies_generated

Vector<StringRefNull, 0> blender::gpu::shader::ShaderCreateInfo::dependencies_generated

Manually set generated dependencies file names.

Definition at line 718 of file gpu_shader_create_info.hh.

◆ depth_write_

DepthWrite blender::gpu::shader::ShaderCreateInfo::depth_write_ = DepthWrite::UNCHANGED

Allow optimization when fragment shader writes to gl_FragDepth.

Definition at line 700 of file gpu_shader_create_info.hh.

Referenced by depth_write(), finalize(), blender::gpu::GLShader::fragment_interface_declare(), and blender::gpu::VKShader::fragment_interface_declare().

◆ do_static_compilation_

bool blender::gpu::shader::ShaderCreateInfo::do_static_compilation_ = false

True if the shader is static and can be pre-compiled at compile time.

Definition at line 690 of file gpu_shader_create_info.hh.

Referenced by blender::gpu::ShaderCompiler::compile(), do_static_compilation(), and blender::gpu::VKShader::init().

◆ early_fragment_test_

bool blender::gpu::shader::ShaderCreateInfo::early_fragment_test_ = false

If true, force depth and stencil tests to always happen before fragment shader invocation.

Definition at line 698 of file gpu_shader_create_info.hh.

Referenced by early_fragment_test(), finalize(), blender::gpu::GLShader::fragment_interface_declare(), and blender::gpu::VKShader::fragment_interface_declare().

◆ finalized_

bool blender::gpu::shader::ShaderCreateInfo::finalized_ = false

If true, all additionally linked create info will be merged into this one.

Definition at line 694 of file gpu_shader_create_info.hh.

Referenced by finalize().

◆ fragment_entry_fn_

StringRefNull blender::gpu::shader::ShaderCreateInfo::fragment_entry_fn_ = "main"

Definition at line 990 of file gpu_shader_create_info.hh.

Referenced by finalize(), and fragment_function().

◆ fragment_outputs_

◆ fragment_source_

◆ fragment_source_generated

std::string blender::gpu::shader::ShaderCreateInfo::fragment_source_generated

Definition at line 713 of file gpu_shader_create_info.hh.

Referenced by operator==(), and pygpu_shader_info_fragment_source().

◆ generated_sources

GeneratedSourceList blender::gpu::shader::ShaderCreateInfo::generated_sources

Definition at line 720 of file gpu_shader_create_info.hh.

Referenced by blender::gpu::ShaderCompiler::compile().

◆ geometry_entry_fn_

StringRefNull blender::gpu::shader::ShaderCreateInfo::geometry_entry_fn_ = "main"

Definition at line 989 of file gpu_shader_create_info.hh.

Referenced by finalize().

◆ geometry_layout_

◆ geometry_out_interfaces_

◆ geometry_resources_

◆ geometry_source_

◆ geometry_source_generated

std::string blender::gpu::shader::ShaderCreateInfo::geometry_source_generated

Definition at line 715 of file gpu_shader_create_info.hh.

◆ interface_names_size_

size_t blender::gpu::shader::ShaderCreateInfo::interface_names_size_ = 0

Maximum length of all the resource names including each null terminator. Only for names used by #gpu::ShaderInterface.

Definition at line 708 of file gpu_shader_create_info.hh.

Referenced by compilation_constant(), finalize(), blender::gpu::GLShaderInterface::GLShaderInterface(), image(), blender::gpu::VKShaderInterface::init(), push_constant(), sampler(), specialization_constant(), storage_buf(), uniform_buf(), and vertex_in().

◆ is_generated_

bool blender::gpu::shader::ShaderCreateInfo::is_generated_ = true

True if the shader is not part of gpu_shader_create_info_list.

Definition at line 692 of file gpu_shader_create_info.hh.

Referenced by blender::gpu::ShaderCompiler::compile().

◆ metal_backend_only_

bool blender::gpu::shader::ShaderCreateInfo::metal_backend_only_ = false

GPU Backend compatibility flag. Temporary requirement until Metal enablement is fully complete.

Definition at line 703 of file gpu_shader_create_info.hh.

Referenced by metal_backend_only().

◆ name_

◆ pass_resources_

Vector<Resource> blender::gpu::shader::ShaderCreateInfo::pass_resources_

Resources are grouped by frequency of change. Pass resources are meant to be valid for the whole pass. Batch resources can be changed in a more granular manner (per object/material). Geometry resources can be changed in a very granular manner (per draw-call). Misuse will only produce suboptimal performance.

Definition at line 940 of file gpu_shader_create_info.hh.

Referenced by blender::compositor::CachedShader::CachedShader(), finalize(), has_resource_type(), blender::gpu::VKShaderInterface::init(), operator<<, operator==(), blender::gpu::GLShader::resources_declare(), blender::gpu::MTLShader::resources_declare(), blender::gpu::VKShader::resources_declare(), resources_get_(), resources_get_all_(), blender::gpu::ShaderInterface::set_image_formats_from_info(), and validate_merge().

◆ push_constants_

◆ shared_variables_

◆ specialization_constants_

◆ subpass_inputs_

◆ typedef_source_generated

std::string blender::gpu::shader::ShaderCreateInfo::typedef_source_generated

◆ typedef_sources_

Vector<StringRefNull> blender::gpu::shader::ShaderCreateInfo::typedef_sources_

◆ vertex_entry_fn_

StringRefNull blender::gpu::shader::ShaderCreateInfo::vertex_entry_fn_ = "main"

Definition at line 989 of file gpu_shader_create_info.hh.

Referenced by finalize(), and vertex_function().

◆ vertex_inputs_

◆ vertex_out_interfaces_

◆ vertex_source_

StringRefNull blender::gpu::shader::ShaderCreateInfo::vertex_source_

◆ vertex_source_generated

std::string blender::gpu::shader::ShaderCreateInfo::vertex_source_generated

Manually set generated code.

Definition at line 712 of file gpu_shader_create_info.hh.

Referenced by operator==(), and pygpu_shader_info_vertex_source().


The documentation for this struct was generated from the following files: