Blender  V3.3
Classes | Public Types | Public Member Functions | Public Attributes | List of all members
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 GPUShader. More...

#include <gpu_shader_create_info.hh>

Inheritance diagram for blender::gpu::shader::ShaderCreateInfo:
GPUCodegenCreateInfo

Classes

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

Public Types

using Self = ShaderCreateInfo
 

Public Member Functions

 ShaderCreateInfo (const char *name)
 
 ~ShaderCreateInfo ()
 
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=-1, 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)
 
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, ImageType type, StringRefNull name, Frequency freq=Frequency::PASS)
 
Selfsampler (int slot, ImageType type, StringRefNull name, Frequency freq=Frequency::PASS, eGPUSamplerState sampler=(eGPUSamplerState) -1)
 
Shader Source
Selfvertex_source (StringRefNull filename)
 
Selfgeometry_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)
 
Selflegacy_resource_location (bool value)
 
Additional Create Info

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

Selfadditional_info (StringRefNull info_name0, StringRefNull info_name1="", StringRefNull info_name2="", StringRefNull info_name3="", StringRefNull info_name4="", StringRefNull info_name5="", StringRefNull info_name6="")
 
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)
 
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 ()
 
std::string check_error () 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
 
bool legacy_resource_location_ = false
 
DepthWrite depth_write_ = DepthWrite::ANY
 
size_t interface_names_size_ = 0
 
BuiltinBits builtins_ = BuiltinBits::NONE
 
std::string vertex_source_generated = ""
 
std::string fragment_source_generated = ""
 
std::string geometry_source_generated = ""
 
std::string typedef_source_generated = ""
 
Vector< const char *, 0 > dependencies_generated
 
Vector< VertInvertex_inputs_
 
GeometryStageLayout geometry_layout_
 
ComputeStageLayout compute_layout_
 
Vector< FragOutfragment_outputs_
 
Vector< Resourcepass_resources_
 
Vector< Resourcebatch_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_
 
Vector< std::array< StringRefNull, 2 > > defines_
 
Vector< StringRefNulladditional_infos_
 

Operators.

bool operator== (const ShaderCreateInfo &b)
 
bool has_resource_type (Resource::BindType bind_type) const
 
bool has_resource_image () const
 
bool has_resource_storage () 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 276 of file gpu_shader_create_info.hh.

Member Typedef Documentation

◆ Self

Definition at line 497 of file gpu_shader_create_info.hh.

Constructor & Destructor Documentation

◆ ShaderCreateInfo()

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

Definition at line 494 of file gpu_shader_create_info.hh.

◆ ~ShaderCreateInfo()

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

Definition at line 495 of file gpu_shader_create_info.hh.

Member Function Documentation

◆ additional_info()

Self& blender::gpu::shader::ShaderCreateInfo::additional_info ( StringRefNull  info_name0,
StringRefNull  info_name1 = "",
StringRefNull  info_name2 = "",
StringRefNull  info_name3 = "",
StringRefNull  info_name4 = "",
StringRefNull  info_name5 = "",
StringRefNull  info_name6 = "" 
)
inline

◆ auto_resource_location()

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

◆ builtins()

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

◆ check_error()

std::string blender::gpu::shader::ShaderCreateInfo::check_error ( ) const

◆ compute_source()

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

Definition at line 662 of file gpu_shader_create_info.hh.

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

References depth_write_.

◆ do_static_compilation()

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

Definition at line 704 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 546 of file gpu_shader_create_info.hh.

References early_fragment_test_.

◆ finalize()

void blender::gpu::shader::ShaderCreateInfo::finalize ( )

◆ fragment_out()

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

Definition at line 564 of file gpu_shader_create_info.hh.

References blend(), fragment_outputs_, and type.

Referenced by createGPUShader(), and pygpu_shader_info_fragment_out().

◆ fragment_source()

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

◆ geometry_layout()

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

IMPORTANT: invocations count is only used if GL_ARB_gpu_shader5 is supported. On implementations that do not supports it, the max_vertices will be multiplied by invocations. Your shader needs to account for this fact. Use #ifdef GPU_ARB_gpu_shader5 and make a code path that does not rely on #gl_InvocationID.

Definition at line 522 of file gpu_shader_create_info.hh.

References geometry_layout_, blender::gpu::shader::ShaderCreateInfo::GeometryStageLayout::invocations, blender::gpu::shader::ShaderCreateInfo::GeometryStageLayout::max_vertices, blender::gpu::shader::ShaderCreateInfo::GeometryStageLayout::primitive_in, and blender::gpu::shader::ShaderCreateInfo::GeometryStageLayout::primitive_out.

Referenced by eevee_shader_material_create_info_amend().

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

References geometry_out_interfaces_.

◆ geometry_source()

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

Definition at line 650 of file gpu_shader_create_info.hh.

References geometry_source_.

Referenced by eevee_shader_material_create_info_amend().

◆ has_resource_image()

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

Definition at line 890 of file gpu_shader_create_info.hh.

References has_resource_type().

◆ has_resource_storage()

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

Definition at line 895 of file gpu_shader_create_info.hh.

References has_resource_type().

◆ has_resource_type()

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

Definition at line 875 of file gpu_shader_create_info.hh.

References batch_resources_, and pass_resources_.

Referenced by has_resource_image(), and has_resource_storage().

◆ image()

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

◆ legacy_resource_location()

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

◆ local_group_size()

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

◆ operator==()

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

◆ push_constant()

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

◆ sampler()

Self& blender::gpu::shader::ShaderCreateInfo::sampler ( int  slot,
ImageType  type,
StringRefNull  name,
Frequency  freq = Frequency::PASS,
eGPUSamplerState  sampler = (eGPUSamplerState)-1 
)
inline

◆ storage_buf()

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

◆ typedef_source()

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

Definition at line 783 of file gpu_shader_create_info.hh.

References typedef_sources_.

Referenced by createGPUShader(), and pygpu_shader_info_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()

void blender::gpu::shader::ShaderCreateInfo::validate_merge ( const ShaderCreateInfo other_info)

Error detection that some backend compilers do not complain about.

Definition at line 170 of file gpu_shader_create_info.cc.

References blender::Set< Key, InlineBufferCapacity, ProbingStrategy, Hash, IsEqual, Slot, Allocator >::add(), auto_resource_location_, batch_resources_, name_, and pass_resources_.

Referenced by finalize().

◆ validate_vertex_attributes()

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

Definition at line 228 of file gpu_shader_create_info.cc.

References BLI_assert, blender::gpu::shader::MAT4, name_, and vertex_inputs_.

Referenced by finalize().

◆ 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

Friends And Related Function Documentation

◆ operator<<

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

Debug print

Definition at line 842 of file gpu_shader_create_info.hh.

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

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

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

Referenced by auto_resource_location(), finalize(), and validate_merge().

◆ batch_resources_

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

◆ builtins_

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

◆ compute_layout_

ComputeStageLayout blender::gpu::shader::ShaderCreateInfo::compute_layout_

◆ compute_source_

StringRefNull blender::gpu::shader::ShaderCreateInfo::compute_source_

◆ defines_

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

◆ dependencies_generated

Vector<const char *, 0> blender::gpu::shader::ShaderCreateInfo::dependencies_generated

Manually set generated dependencies.

Definition at line 304 of file gpu_shader_create_info.hh.

Referenced by GPUCodegen::generate_library().

◆ depth_write_

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

Allow optimization when fragment shader writes to gl_FragDepth.

Definition at line 290 of file gpu_shader_create_info.hh.

Referenced by depth_write(), finalize(), and blender::gpu::GLShader::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 280 of file gpu_shader_create_info.hh.

Referenced by do_static_compilation(), and GPU_shader_create_from_info_name().

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

Referenced by early_fragment_test(), finalize(), and blender::gpu::GLShader::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 282 of file gpu_shader_create_info.hh.

Referenced by finalize().

◆ fragment_outputs_

Vector<FragOut> blender::gpu::shader::ShaderCreateInfo::fragment_outputs_

◆ fragment_source_

StringRefNull blender::gpu::shader::ShaderCreateInfo::fragment_source_

◆ fragment_source_generated

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

◆ geometry_layout_

GeometryStageLayout blender::gpu::shader::ShaderCreateInfo::geometry_layout_

◆ geometry_out_interfaces_

Vector<StageInterfaceInfo *> blender::gpu::shader::ShaderCreateInfo::geometry_out_interfaces_

◆ geometry_source_

StringRefNull blender::gpu::shader::ShaderCreateInfo::geometry_source_

◆ geometry_source_generated

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

Definition at line 301 of file gpu_shader_create_info.hh.

Referenced by eevee_shader_material_create_info_amend().

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

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

◆ legacy_resource_location_

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

If true, force the use of the GL shader introspection for resource location.

Definition at line 288 of file gpu_shader_create_info.hh.

Referenced by blender::gpu::GLShader::finalize(), GPU_shader_create_from_info(), and legacy_resource_location().

◆ name_

StringRefNull blender::gpu::shader::ShaderCreateInfo::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). Mis-usage will only produce suboptimal performance.

Definition at line 460 of file gpu_shader_create_info.hh.

Referenced by count_active_texture_sampler(), finalize(), blender::gpu::GLShaderInterface::GLShaderInterface(), has_resource_type(), image(), operator==(), blender::gpu::GLShader::resources_declare(), sampler(), storage_buf(), uniform_buf(), and validate_merge().

◆ push_constants_

Vector<PushConst> blender::gpu::shader::ShaderCreateInfo::push_constants_

◆ typedef_source_generated

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

◆ typedef_sources_

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

◆ vertex_inputs_

Vector<VertIn> blender::gpu::shader::ShaderCreateInfo::vertex_inputs_

◆ vertex_out_interfaces_

Vector<StageInterfaceInfo *> blender::gpu::shader::ShaderCreateInfo::vertex_out_interfaces_

◆ vertex_source_

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

◆ vertex_source_generated

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

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