private static void EmitOutputsInitialization(EmitterContext context, ShaderConfig config) { // Compute has no output attributes, and fragment is the last stage, so we // don't need to initialize outputs on those stages. if (config.Stage == ShaderStage.Compute || config.Stage == ShaderStage.Fragment) { return; } if (config.Stage == ShaderStage.Vertex) { InitializeOutput(context, AttributeConsts.PositionX, perPatch: false); } UInt128 usedAttributes = context.Config.NextInputAttributesComponents; while (usedAttributes != UInt128.Zero) { int index = usedAttributes.TrailingZeroCount(); int vecIndex = index / 4; usedAttributes &= ~UInt128.Pow2(index); // We don't need to initialize passthrough attributes. if ((context.Config.PassthroughAttributes & (1 << vecIndex)) != 0) { continue; } InitializeOutputComponent(context, AttributeConsts.UserAttributeBase + index * 4, perPatch: false); } UInt128 usedAttributesPerPatch = context.Config.NextInputAttributesPerPatchComponents; while (usedAttributesPerPatch != UInt128.Zero) { int index = usedAttributesPerPatch.TrailingZeroCount(); InitializeOutputComponent(context, AttributeConsts.UserAttributeBase + index * 4, perPatch: true); usedAttributesPerPatch &= ~UInt128.Pow2(index); } if (config.NextUsesFixedFuncAttributes) { for (int i = 0; i < 4 + AttributeConsts.TexCoordCount; i++) { int index = config.GetFreeUserAttribute(isOutput: true, i); if (index < 0) { break; } InitializeOutput(context, AttributeConsts.UserAttributeBase + index * 16, perPatch: false); config.SetOutputUserAttributeFixedFunc(index); } } }
private static void EmitOutputsInitialization(EmitterContext context, ShaderConfig config) { // Compute has no output attributes, and fragment is the last stage, so we // don't need to initialize outputs on those stages. if (config.Stage == ShaderStage.Compute || config.Stage == ShaderStage.Fragment) { return; } if (config.Stage == ShaderStage.Vertex) { InitializeOutput(context, AttributeConsts.PositionX, perPatch: false); } int usedAttributes = context.Config.UsedOutputAttributes; while (usedAttributes != 0) { int index = BitOperations.TrailingZeroCount(usedAttributes); InitializeOutput(context, AttributeConsts.UserAttributeBase + index * 16, perPatch: false); usedAttributes &= ~(1 << index); } int usedAttributesPerPatch = context.Config.UsedOutputAttributesPerPatch; while (usedAttributesPerPatch != 0) { int index = BitOperations.TrailingZeroCount(usedAttributesPerPatch); InitializeOutput(context, AttributeConsts.UserAttributeBase + index * 16, perPatch: true); usedAttributesPerPatch &= ~(1 << index); } if (config.NextUsesFixedFuncAttributes) { for (int i = 0; i < 4 + AttributeConsts.TexCoordCount; i++) { int index = config.GetFreeUserAttribute(isOutput: true, i); if (index < 0) { break; } InitializeOutput(context, AttributeConsts.UserAttributeBase + index * 16, perPatch: false); config.SetOutputUserAttributeFixedFunc(index); } } }