pub struct Writer<'a, W> {Show 18 fields
module: &'a Module,
info: &'a ModuleInfo,
out: W,
options: &'a Options,
policies: BoundsCheckPolicies,
features: FeaturesManager,
namer: Namer,
names: FastHashMap<NameKey, String>,
reflection_names_globals: FastHashMap<Handle<GlobalVariable>, String>,
entry_point: &'a EntryPoint,
entry_point_idx: EntryPointIndex,
block_id: IdGenerator,
named_expressions: FastIndexMap<Handle<Expression>, String>,
need_bake_expressions: NeedBakeExpressions,
continue_ctx: ContinueCtx,
multiview: Option<NonZeroU32>,
varying: FastHashMap<String, VaryingLocation>,
clip_distance_count: u32,
}Expand description
Writer responsible for all code generation.
Fields§
§module: &'a ModuleThe module being written.
info: &'a ModuleInfoThe module analysis.
out: WThe output writer.
options: &'a OptionsUser defined configuration to be used.
policies: BoundsCheckPoliciesThe bound checking policies to be used
features: FeaturesManagerFeatures manager used to store all the needed features and write them.
namer: Namer§names: FastHashMap<NameKey, String>A map with all the names needed for writing the module
(generated by a Namer).
reflection_names_globals: FastHashMap<Handle<GlobalVariable>, String>A map with the names of global variables needed for reflections.
entry_point: &'a EntryPointThe selected entry point.
entry_point_idx: EntryPointIndexThe index of the selected entry point.
block_id: IdGeneratorA generator for unique block numbers.
named_expressions: FastIndexMap<Handle<Expression>, String>Set of expressions that have associated temporary variables.
need_bake_expressions: NeedBakeExpressionsSet of expressions that need to be baked to avoid unnecessary repetition in output
continue_ctx: ContinueCtxInformation about nesting of loops and switches.
Used for forwarding continue statements in switches that have been
transformed to do {} while(false); loops.
multiview: Option<NonZeroU32>How many views to render to, if doing multiview rendering.
varying: FastHashMap<String, VaryingLocation>Mapping of varying variables to their location. Needed for reflections.
clip_distance_count: u32Number of user-defined clip planes. Only non-zero for vertex shaders.
Implementations§
Source§impl<W> Writer<'_, W>
impl<W> Writer<'_, W>
Sourcepub(super) fn collect_required_features(&mut self) -> Result<(), Error>
pub(super) fn collect_required_features(&mut self) -> Result<(), Error>
Helper method that searches the module for all the needed Features
§Errors
If the version doesn’t support any of the needed Features a
Error::MissingFeatures will be returned
Sourcefn scalar_required_features(&mut self, scalar: Scalar)
fn scalar_required_features(&mut self, scalar: Scalar)
Helper method that checks the Features needed by a scalar
fn varying_required_features( &mut self, binding: Option<&Binding>, ty: Handle<Type>, )
Source§impl<'a, W: Write> Writer<'a, W>
impl<'a, W: Write> Writer<'a, W>
Sourcepub fn new(
out: W,
module: &'a Module,
info: &'a ModuleInfo,
options: &'a Options,
pipeline_options: &'a PipelineOptions,
policies: BoundsCheckPolicies,
) -> Result<Self, Error>
pub fn new( out: W, module: &'a Module, info: &'a ModuleInfo, options: &'a Options, pipeline_options: &'a PipelineOptions, policies: BoundsCheckPolicies, ) -> Result<Self, Error>
Sourcepub fn write(&mut self) -> Result<ReflectionInfo, Error>
pub fn write(&mut self) -> Result<ReflectionInfo, Error>
fn write_array_size( &mut self, base: Handle<Type>, size: ArraySize, ) -> Result<(), Error>
Sourcefn write_image_type(
&mut self,
dim: ImageDimension,
arrayed: bool,
class: ImageClass,
) -> Result<(), Error>
fn write_image_type( &mut self, dim: ImageDimension, arrayed: bool, class: ImageClass, ) -> Result<(), Error>
Sourcefn write_global_layout(&mut self, global: &GlobalVariable) -> Result<(), Error>
fn write_global_layout(&mut self, global: &GlobalVariable) -> Result<(), Error>
Helper method used by Self::write_global to write just the layout part of a non image/sampler global variable, if applicable.
§Notes
Adds trailing whitespace if any layout qualifier is written
Sourcefn write_global(
&mut self,
handle: Handle<GlobalVariable>,
global: &GlobalVariable,
) -> Result<(), Error>
fn write_global( &mut self, handle: Handle<GlobalVariable>, global: &GlobalVariable, ) -> Result<(), Error>
fn write_simple_global( &mut self, handle: Handle<GlobalVariable>, global: &GlobalVariable, ) -> Result<(), Error>
Sourcefn write_interface_block(
&mut self,
handle: Handle<GlobalVariable>,
global: &GlobalVariable,
) -> Result<(), Error>
fn write_interface_block( &mut self, handle: Handle<GlobalVariable>, global: &GlobalVariable, ) -> Result<(), Error>
Write an interface block for a single Naga global.
Write block_name { members }. Since block_name must be unique
between blocks and structs, we add _block_ID where ID is a
IdGenerator generated number. Write members in the same way we write
a struct’s members.
Sourcefn update_expressions_to_bake(&mut self, func: &Function, info: &FunctionInfo)
fn update_expressions_to_bake(&mut self, func: &Function, info: &FunctionInfo)
Helper method used to find which expressions of a given function require baking
§Notes
Clears need_bake_expressions set before adding to it
Sourcefn get_global_name(
&self,
handle: Handle<GlobalVariable>,
global: &GlobalVariable,
) -> String
fn get_global_name( &self, handle: Handle<GlobalVariable>, global: &GlobalVariable, ) -> String
Helper method used to get a name for a global
Globals have different naming schemes depending on their binding:
- Globals without bindings use the name from the
Namer - Globals with resource binding are named
_group_X_binding_YwhereXis the group andYis the binding
Sourcefn write_global_name(
&mut self,
handle: Handle<GlobalVariable>,
global: &GlobalVariable,
) -> Result<(), Error>
fn write_global_name( &mut self, handle: Handle<GlobalVariable>, global: &GlobalVariable, ) -> Result<(), Error>
Helper method used to write a name for a global without additional heap allocation
Sourcefn write_varying(
&mut self,
binding: Option<&Binding>,
ty: Handle<Type>,
output: bool,
) -> Result<(), Error>
fn write_varying( &mut self, binding: Option<&Binding>, ty: Handle<Type>, output: bool, ) -> Result<(), Error>
Write a GLSL global that will carry a Naga entry point’s argument or return value.
A Naga entry point’s arguments and return value are rendered in GLSL as
variables at global scope with the in and out storage qualifiers.
The code we generate for main loads from all the in globals into
appropriately named locals. Before it returns, main assigns the
components of its return value into all the out globals.
This function writes a declaration for one such GLSL global,
representing a value passed into or returned from self.entry_point
that has a Location binding. The global’s name is generated based on
the location index and the shader stages being connected; see
VaryingName. This means we don’t need to know the names of
arguments, just their types and bindings.
Emit nothing for entry point arguments or return values with BuiltIn
bindings; main will read from or assign to the appropriate GLSL
special variable; these are pre-declared. As an exception, we do declare
gl_Position or gl_FragCoord with the invariant qualifier if
needed.
Use output together with self.entry_point.stage to determine which
shader stages are being connected, and choose the in or out storage
qualifier.
Sourcefn write_function(
&mut self,
ty: FunctionType,
func: &Function,
info: &FunctionInfo,
) -> Result<(), Error>
fn write_function( &mut self, ty: FunctionType, func: &Function, info: &FunctionInfo, ) -> Result<(), Error>
Helper method used to write functions (both entry points and regular functions)
§Notes
Adds a newline
fn write_workgroup_variables_initialization( &mut self, ctx: &FunctionCtx<'_>, ) -> Result<(), Error>
Sourcefn write_slice<T, F: FnMut(&mut Self, u32, &T) -> Result<(), Error>>(
&mut self,
data: &[T],
f: F,
) -> Result<(), Error>
fn write_slice<T, F: FnMut(&mut Self, u32, &T) -> Result<(), Error>>( &mut self, data: &[T], f: F, ) -> Result<(), Error>
Write a list of comma separated T values using a writer function F.
The writer function F receives a mutable reference to self that if needed won’t cause
borrow checker issues (using for example a closure with self will cause issues), the
second argument is the 0 based index of the element on the list, and the last element is
a reference to the element T being written
§Notes
- Adds no newlines or leading/trailing whitespace
- The last element won’t have a trailing
,
Sourcefn write_global_constant(
&mut self,
handle: Handle<Constant>,
) -> Result<(), Error>
fn write_global_constant( &mut self, handle: Handle<Constant>, ) -> Result<(), Error>
Helper method used to write global constants
Sourcefn write_dot_product(
&mut self,
arg: Handle<Expression>,
arg1: Handle<Expression>,
size: usize,
ctx: &FunctionCtx<'_>,
) -> Result<(), Error>
fn write_dot_product( &mut self, arg: Handle<Expression>, arg1: Handle<Expression>, size: usize, ctx: &FunctionCtx<'_>, ) -> Result<(), Error>
Helper method used to output a dot product as an arithmetic expression
Sourcefn write_struct_body(
&mut self,
handle: Handle<Type>,
members: &[StructMember],
) -> Result<(), Error>
fn write_struct_body( &mut self, handle: Handle<Type>, members: &[StructMember], ) -> Result<(), Error>
Sourcefn write_stmt(
&mut self,
sta: &Statement,
ctx: &FunctionCtx<'_>,
level: Level,
) -> Result<(), Error>
fn write_stmt( &mut self, sta: &Statement, ctx: &FunctionCtx<'_>, level: Level, ) -> Result<(), Error>
Sourcefn write_const_expr(
&mut self,
expr: Handle<Expression>,
arena: &Arena<Expression>,
) -> Result<(), Error>
fn write_const_expr( &mut self, expr: Handle<Expression>, arena: &Arena<Expression>, ) -> Result<(), Error>
Write a const expression.
Write expr, a handle to an Expression in the current Module’s
constant expression arena, as GLSL expression.
§Notes
Adds no newlines or leading/trailing whitespace
Sourcefn write_possibly_const_expr<'w, I, E>(
&'w mut self,
expr: Handle<Expression>,
expressions: &Arena<Expression>,
info: I,
write_expression: E,
) -> Result<(), Error>where
I: Fn(Handle<Expression>) -> &'w TypeResolution,
E: Fn(&mut Self, Handle<Expression>) -> Result<(), Error>,
fn write_possibly_const_expr<'w, I, E>(
&'w mut self,
expr: Handle<Expression>,
expressions: &Arena<Expression>,
info: I,
write_expression: E,
) -> Result<(), Error>where
I: Fn(Handle<Expression>) -> &'w TypeResolution,
E: Fn(&mut Self, Handle<Expression>) -> Result<(), Error>,
Write Expression variants that can occur in both runtime and const expressions.
Write expr, a handle to an Expression in the arena expressions,
as as GLSL expression. This must be one of the Expression variants
that is allowed to occur in constant expressions.
Use write_expression to write subexpressions.
This is the common code for write_expr, which handles arbitrary
runtime expressions, and write_const_expr, which only handles
const-expressions. Each of those callers passes itself (essentially) as
the write_expression callback, so that subexpressions are restricted
to the appropriate variants.
§Notes
Adds no newlines or leading/trailing whitespace
Sourcefn write_expr(
&mut self,
expr: Handle<Expression>,
ctx: &FunctionCtx<'_>,
) -> Result<(), Error>
fn write_expr( &mut self, expr: Handle<Expression>, ctx: &FunctionCtx<'_>, ) -> Result<(), Error>
Sourcefn write_clamped_lod(
&mut self,
ctx: &FunctionCtx<'_>,
expr: Handle<Expression>,
image: Handle<Expression>,
level_expr: Handle<Expression>,
) -> Result<(), Error>
fn write_clamped_lod( &mut self, ctx: &FunctionCtx<'_>, expr: Handle<Expression>, image: Handle<Expression>, level_expr: Handle<Expression>, ) -> Result<(), Error>
Helper function to write the local holding the clamped lod
fn get_coordinate_vector_size(&self, dim: ImageDimension, arrayed: bool) -> u8
Sourcefn write_texture_coord(
&mut self,
ctx: &FunctionCtx<'_>,
vector_size: u8,
coordinate: Handle<Expression>,
array_index: Option<Handle<Expression>>,
tex_1d_hack: bool,
) -> Result<(), Error>
fn write_texture_coord( &mut self, ctx: &FunctionCtx<'_>, vector_size: u8, coordinate: Handle<Expression>, array_index: Option<Handle<Expression>>, tex_1d_hack: bool, ) -> Result<(), Error>
Helper method to write the coordinate vector for image operations
Sourcefn write_image_store(
&mut self,
ctx: &FunctionCtx<'_>,
image: Handle<Expression>,
coordinate: Handle<Expression>,
array_index: Option<Handle<Expression>>,
value: Handle<Expression>,
) -> Result<(), Error>
fn write_image_store( &mut self, ctx: &FunctionCtx<'_>, image: Handle<Expression>, coordinate: Handle<Expression>, array_index: Option<Handle<Expression>>, value: Handle<Expression>, ) -> Result<(), Error>
Helper method to write the ImageStore statement
Sourcefn write_image_atomic(
&mut self,
ctx: &FunctionCtx<'_>,
image: Handle<Expression>,
coordinate: Handle<Expression>,
array_index: Option<Handle<Expression>>,
fun: AtomicFunction,
value: Handle<Expression>,
) -> Result<(), Error>
fn write_image_atomic( &mut self, ctx: &FunctionCtx<'_>, image: Handle<Expression>, coordinate: Handle<Expression>, array_index: Option<Handle<Expression>>, fun: AtomicFunction, value: Handle<Expression>, ) -> Result<(), Error>
Helper method to write the ImageAtomic statement
Sourcefn write_image_load(
&mut self,
handle: Handle<Expression>,
ctx: &FunctionCtx<'_>,
image: Handle<Expression>,
coordinate: Handle<Expression>,
array_index: Option<Handle<Expression>>,
sample: Option<Handle<Expression>>,
level: Option<Handle<Expression>>,
) -> Result<(), Error>
fn write_image_load( &mut self, handle: Handle<Expression>, ctx: &FunctionCtx<'_>, image: Handle<Expression>, coordinate: Handle<Expression>, array_index: Option<Handle<Expression>>, sample: Option<Handle<Expression>>, level: Option<Handle<Expression>>, ) -> Result<(), Error>
Helper method for writing an ImageLoad expression.
fn write_named_expr( &mut self, handle: Handle<Expression>, name: String, named: Handle<Expression>, ctx: &FunctionCtx<'_>, ) -> Result<(), Error>
Sourcefn write_zero_init_value(&mut self, ty: Handle<Type>) -> Result<(), Error>
fn write_zero_init_value(&mut self, ty: Handle<Type>) -> Result<(), Error>
Helper function that write string with default zero initialization for supported types
Sourcefn write_zero_init_scalar(&mut self, kind: ScalarKind) -> Result<(), Error>
fn write_zero_init_scalar(&mut self, kind: ScalarKind) -> Result<(), Error>
Helper function that write string with zero initialization for scalar
Sourcefn write_control_barrier(
&mut self,
flags: Barrier,
level: Level,
) -> Result<(), Error>
fn write_control_barrier( &mut self, flags: Barrier, level: Level, ) -> Result<(), Error>
Issue a control barrier.
Sourcefn write_memory_barrier(
&mut self,
flags: Barrier,
level: Level,
) -> Result<(), Error>
fn write_memory_barrier( &mut self, flags: Barrier, level: Level, ) -> Result<(), Error>
Issue a memory barrier.
Sourcefn write_storage_access(
&mut self,
storage_access: StorageAccess,
) -> Result<(), Error>
fn write_storage_access( &mut self, storage_access: StorageAccess, ) -> Result<(), Error>
Helper function that return the glsl storage access string of StorageAccess
glsl allows adding both readonly and writeonly but this means that
they can only be used to query information about the resource which isn’t what
we want here so when storage access is both LOAD and STORE add no modifiers
Sourcefn collect_reflection_info(&mut self) -> Result<ReflectionInfo, Error>
fn collect_reflection_info(&mut self) -> Result<ReflectionInfo, Error>
Helper method used to produce the reflection info that’s returned to the user