Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
                }
            }
        }