Blender V4.5
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 #GPUShader. More...

#include <gpu_shader_create_info.hh>

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

Classes

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

Public Types

using Self = ShaderCreateInfo

Public Member Functions

VectorVector< Resource > & resources_get_ (Frequency freq)
VectorVector< 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)
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)
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, eGPUTextureFormat 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)
Push constants

Data managed by GPUShader. 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)
API-Specific Parameters

Optional parameters exposed by specific back-ends to enable additional features and performance tuning. NOTE: These functions can be exposed as a pass-through on unsupported configurations.

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)
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 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
VectorVector< StringRefNull, 0 > dependencies_generated
VectorVector< VertInvertex_inputs_
GeometryStageLayout geometry_layout_
ComputeStageLayout compute_layout_
VectorVector< FragOutfragment_outputs_
VectorVector< SubpassInsubpass_inputs_
VectorVector< CompilationConstant, 0 > compilation_constants_
VectorVector< SpecializationConstant > specialization_constants_
VectorVector< Resourcepass_resources_
VectorVector< Resourcebatch_resources_
VectorVector< Resourcegeometry_resources_
VectorVector< StageInterfaceInfo * > vertex_out_interfaces_
VectorVector< StageInterfaceInfo * > geometry_out_interfaces_
VectorVector< PushConstpush_constants_
VectorVector< StringRefNulltypedef_sources_
StringRefNull vertex_source_
StringRefNull geometry_source_
StringRefNull fragment_source_
StringRefNull compute_source_
VectorVector< std::array< StringRefNull, 2 > > defines_
VectorVector< 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 #GPUShader.

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 626 of file gpu_shader_create_info.hh.

Member Typedef Documentation

◆ Self

Constructor & Destructor Documentation

◆ ShaderCreateInfo()

Definition at line 902 of file gpu_shader_create_info.hh.

◆ ~ShaderCreateInfo()

Member Function Documentation

◆ additional_info() [1/2]

◆ additional_info() [2/2]

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

Definition at line 1261 of file gpu_shader_create_info.hh.

◆ auto_resource_location()

◆ builtins()

◆ check_error()

◆ compilation_constant()

Definition at line 1007 of file gpu_shader_create_info.hh.

◆ compute_source()

◆ define()

◆ depth_write()

◆ do_static_compilation()

◆ early_fragment_test()

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

Definition at line 948 of file gpu_shader_create_info.hh.

◆ finalize()

Definition at line 99 of file gpu_shader_create_info.cc.

◆ 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 924 of file gpu_shader_create_info.hh.

◆ geometry_out()

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 960 of file gpu_shader_create_info.hh.

◆ has_resource_image()

◆ has_resource_type()

◆ image()

Self & blender::gpu::shader::ShaderCreateInfo::image ( int slot,
eGPUTextureFormat format,
Qualifier qualifiers,
ImageReadWriteType type,
StringRefNull name,
Frequency freq = Frequency::PASS )
inline

Definition at line 1120 of file gpu_shader_create_info.hh.

◆ is_vulkan_compatible()

◆ 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

◆ metal_backend_only()

◆ mtl_max_total_threads_per_threadgroup()

Definition at line 1297 of file gpu_shader_create_info.hh.

◆ operator==()

bool blender::gpu::shader::ShaderCreateInfo::operator== ( const ShaderCreateInfo & b) const
inline

Definition at line 1337 of file gpu_shader_create_info.hh.

◆ push_constant()

◆ resources_get_()

◆ resources_get_all_()

◆ sampler()

◆ specialization_constant()

Definition at line 1057 of file gpu_shader_create_info.hh.

◆ 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 990 of file gpu_shader_create_info.hh.

◆ typedef_source()

◆ uniform_buf()

Self & blender::gpu::shader::ShaderCreateInfo::uniform_buf ( int slot,
StringRefNull type_name,
StringRefNull name,
Frequency freq = Frequency::PASS )
inline

◆ validate_merge()

Error detection that some backend compilers do not complain about.

Definition at line 333 of file gpu_shader_create_info.cc.

◆ validate_vertex_attributes()

◆ vertex_in()

◆ vertex_out()

◆ vertex_source()

◆ operator<<

std::ostream & operator<< ( std::ostream & stream,
const ShaderCreateInfo & info )
friend

Debug print

Definition at line 1366 of file gpu_shader_create_info.hh.

Member Data Documentation

◆ 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 894 of file gpu_shader_create_info.hh.

Referenced by blender::eevee::ShaderModule::material_create_info_amend().

◆ auto_resource_location_

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

Definition at line 634 of file gpu_shader_create_info.hh.

◆ batch_resources_

◆ builtins_

BuiltinBits blender::gpu::shader::ShaderCreateInfo::builtins_ = BuiltinBits::NONE

Manually set builtins.

Definition at line 648 of file gpu_shader_create_info.hh.

◆ compilation_constants_

◆ compute_layout_

◆ compute_source_

◆ compute_source_generated

◆ defines_

◆ dependencies_generated

◆ depth_write_

Allow optimization when fragment shader writes to gl_FragDepth.

Definition at line 638 of file gpu_shader_create_info.hh.

◆ do_static_compilation_

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

Definition at line 630 of file gpu_shader_create_info.hh.

Referenced by GPU_shader_create_from_info_name().

◆ early_fragment_test_

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

Definition at line 636 of file gpu_shader_create_info.hh.

◆ finalized_

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

Definition at line 632 of file gpu_shader_create_info.hh.

◆ fragment_outputs_

◆ fragment_source_

◆ fragment_source_generated

◆ geometry_layout_

◆ geometry_out_interfaces_

◆ geometry_resources_

◆ geometry_source_

◆ geometry_source_generated

◆ interface_names_size_

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

Definition at line 646 of file gpu_shader_create_info.hh.

◆ metal_backend_only_

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

Definition at line 641 of file gpu_shader_create_info.hh.

◆ name_

◆ 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 839 of file gpu_shader_create_info.hh.

◆ push_constants_

◆ specialization_constants_

◆ subpass_inputs_

◆ typedef_source_generated

◆ typedef_sources_

◆ vertex_inputs_

◆ vertex_out_interfaces_

◆ vertex_source_

◆ vertex_source_generated


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