예제 #1
0
파일: EmitContext.cs 프로젝트: kzyg/spark
 public IEmitVal EmitExp(
     MidExp exp,
     IEmitBlock block,
     EmitEnv env)
 {
     return(EmitExpImpl((dynamic)exp, block, env));
 }
 public MidAttributeDecl(
     Identifier name,
     MidElementDecl element,
     MidType type,
     MidExp exp )
 {
     _name = name;
     _element = element;
     _type = type;
     _exp = exp;
 }
예제 #3
0
 public MidLetExp(
     SourceRange range,
     MidVar var,
     MidExp exp,
     MidExp body)
     : base(range, new MidDummyType())
 {
     _var = var;
     _exp = exp;
     _body = body;
 }
        public static void MarkOutputs(MidExp exp)
        {
            MidTransform transform = new MidTransform(
                (e) =>
                {
                    if (e is MidAttributeFetch)
                        ((MidAttributeFetch)e).Attribute.IsOutput = true;
                    return e;
                });

            transform.Transform(exp);
        }
예제 #5
0
        private void SetSource(
            ref MidExp srcExp,
            MidAttributeDecl attr)
        {
            if (srcExp != null)
            {
                if (srcExp is MidAttributeRef)
                {
                    var srcAttr = ((MidAttributeRef)srcExp).Decl;
                    if (srcAttr != attr)
                    {
                        throw OperationTooComplexError(srcExp.Range);
                    }
                }
                else
                {
                    throw OperationTooComplexError(srcExp.Range);
                }
            }

            srcExp = new MidAttributeRef(attr.Range, attr, new LazyFactory());
        }
예제 #6
0
 private AttrInfo DecomposeAttr(
     MidExp exp,
     DecomposeAttrContext context)
 {
     return(DecomposeAttrImpl((dynamic)exp, context));
 }
        public EmitValHLSL EmitExp(
            MidExp exp,
            Span span)
        {
            if (exp is MidVal)
                return EmitVal((MidVal)exp, span);

            EmitValHLSL expVal = EmitExpRaw(exp, span);

            if (exp is MidLetExp)
                return expVal;

            if (exp.Type == null)
            {
                throw new NotImplementedException();
            }

            if (exp.Type is MidVoidType)
            {
                return VoidVal;
            }
            if (expVal is VoidValHLSL)
            {
                return expVal;
            }

            // \todo: Why not use the type of the result?
            var expType = EmitType(exp.Type);
            var temp = expType.CreateVal(
                _shared.GenerateName("_t"));

            DeclareAndInitLocal(
                temp,
                expVal,
                span);

            return temp;
        }
 private AttrInfo DecomposeAttrImpl(
     MidExp exp,
     DecomposeAttrContext context)
 {
     throw OperationTooComplexError(exp.Range);
 }
 // Expressions
 public void PreEmitExp(
     MidExp exp,
     Span span)
 {
     PreEmitExpImpl((dynamic)exp, span);
 }
 private EmitValHLSL EmitExpRaw(MidExp exp, Span span)
 {
     return EmitExpImpl((dynamic)exp, span);
 }
예제 #11
0
        private bool UsesVar(
            MidExp exp,
            MidVar var)
        {
            bool result = false;
            var transform = new MidTransform(
                (e) =>
                {
                    if (e is MidVarRef && (e as MidVarRef).Var == var)
                        result = true;
                    return e;
                });

            transform.Transform(exp);

            return result;
        }
예제 #12
0
 private AttributeInfo DecomposeAttrImpl(
     SourceRange range,
     MidExp exp)
 {
     throw OperationTooComplex(exp.Range);
 }
예제 #13
0
 public MidLabelExp(
     SourceRange range,
     MidLabel label,
     MidExp body,
     MidType type)
     : base(range, type)
 {
     _label = label;
     _body = body;
 }
예제 #14
0
 private MidExp TryFoldPath(
     MidVar var,
     MidExp exp,
     MidPath path)
 {
     if (exp is MidFieldRef)
     {
         var midFieldRef = (MidFieldRef)exp;
         if (midFieldRef.Obj is MidVarRef)
         {
             var midVarRef = (MidVarRef) midFieldRef.Obj;
             if (midVarRef.Var == var)
             {
                 midFieldRef.Obj = path;
                 return midFieldRef;
             }
         }
     }
     return exp;
 }
 private MidExp PreTransform(MidExp exp)
 {
     if (_preTransform == null)
         return exp;
     return _preTransform(exp);
 }
 public void TransformChildren(MidExp exp)
 {
     TransformChildrenImpl((dynamic)exp);
 }
 public MidExp Transform(MidExp exp)
 {
     var e = PreTransform(exp);
     TransformChildren(e);
     e = PostTransform(e);
     return e;
 }
 public MidExp PreTransform(MidExp exp)
 {
     return exp;
 }
 private MidExp Replace(
     MidExp exp)
 {
     return ReplaceImpl((dynamic)exp);
 }
예제 #20
0
        private MidExp SimplifyLabelExpImpl(
            MidLabelExp labelExp,
            MidExp exp,
            SimplifyEnv env)
        {
            if (!UsesLabel(exp, labelExp.Label))
                return exp;

            return labelExp;
        }
예제 #21
0
 private AttrInfo DecomposeAttrImpl(
     MidExp exp,
     DecomposeAttrContext context)
 {
     throw OperationTooComplexError(exp.Range);
 }
예제 #22
0
        private bool UsesLabel(
            MidExp exp,
            MidLabel label)
        {
            bool result = false;
            var transform = new MidTransform(
                (e) =>
                {
                    if (e is MidBreakExp && (e as MidBreakExp).Label == label)
                        result = true;
                    return e;
                });

            transform.Transform(exp);

            return result;
        }
예제 #23
0
        //



        public override void EmitImplSetup()
        {
            var uniformElement  = GetElement("Uniform");
            var rasterVertex    = GetElement("RasterVertex");
            var fragmentElement = GetElement("Fragment");
            var pixelElement    = GetElement("Pixel");

            // Find all render targets:

            renderTargetAttributes = (from a in pixelElement.Attributes
                                      where a.Exp != null
                                      where a.IsOutput
                                      select a).ToArray();
            renderTargetCount = renderTargetAttributes.Length;

            // Depth-stencil view

            depthStencilViewAttribute = GetAttribute(uniformElement, "depthStencilView");


            // Compute the setup required by the OM


            // Blending stuff
            var blendStateType = EmitTarget.GetOpaqueType("ID3D11BlendState*");

            blendStateField = EmitClass.AddPrivateField(
                blendStateType,
                "_blendState");


            _renderTargetBlendDescs = new TargetBlendDesc[renderTargetCount];
            _renderTargetSources    = new SourceInfo[renderTargetCount];
            for (int ii = 0; ii < renderTargetCount; ++ii)
            {
                DecomposeAttr(renderTargetAttributes[ii], ii);
            }

            var rtBlendDescType = EmitTarget.GetBuiltinType("D3D11_RENDER_TARGET_BLEND_DESC");
            var blendSpecVals   = (from desc in _renderTargetBlendDescs
                                   select InitBlock.Struct(
                                       "D3D11_RENDER_TARGET_BLEND_DESC",
                                       InitBlock.LiteralBool(desc.blendEnable),
                                       InitBlock.Enum32(desc.color.srcBlend),
                                       InitBlock.Enum32(desc.color.destBlend),
                                       InitBlock.Enum32(desc.color.op),
                                       InitBlock.Enum32(desc.alpha.srcBlend),
                                       InitBlock.Enum32(desc.alpha.destBlend),
                                       InitBlock.Enum32(desc.alpha.op),
                                       InitBlock.LiteralU32(desc.writeMask))).ToList();

            while (blendSpecVals.Count < 8) // \todo: get the limits from somwhere!!!
            {
                blendSpecVals.Add(
                    InitBlock.Struct(
                        "D3D11_RENDER_TARGET_BLEND_DESC",
                        InitBlock.LiteralBool(false),
                        InitBlock.Enum32("D3D11_BLEND", "D3D11_BLEND_ONE", D3D11_BLEND.D3D11_BLEND_ONE),
                        InitBlock.Enum32("D3D11_BLEND", "D3D11_BLEND_ZERO", D3D11_BLEND.D3D11_BLEND_ZERO),
                        InitBlock.Enum32("D3D11_BLEND_OP", "D3D11_BLEND_OP_ADD", D3D11_BLEND_OP.D3D11_BLEND_OP_ADD),
                        InitBlock.Enum32("D3D11_BLEND", "D3D11_BLEND_ONE", D3D11_BLEND.D3D11_BLEND_ONE),
                        InitBlock.Enum32("D3D11_BLEND", "D3D11_BLEND_ZERO", D3D11_BLEND.D3D11_BLEND_ZERO),
                        InitBlock.Enum32("D3D11_BLEND_OP", "D3D11_BLEND_OP_ADD", D3D11_BLEND_OP.D3D11_BLEND_OP_ADD),
                        InitBlock.LiteralU32((UInt32)D3D11_COLOR_WRITE_ENABLE.D3D11_COLOR_WRITE_ENABLE_ALL)));
            }

            var blendSpecsVal = InitBlock.Array(
                rtBlendDescType,
                blendSpecVals);


            InitBlock.AppendComment("D3D11 Output Merger");
            var blendDescVal =
                InitBlock.Temp("blendDesc",
                               InitBlock.Struct(
                                   "D3D11_BLEND_DESC",
                                   InitBlock.LiteralBool(false),
                                   InitBlock.LiteralBool(true),
                                   blendSpecsVal));

            InitBlock.SetArrow(
                CtorThis,
                blendStateField,
                EmitTarget.GetNullPointer(blendStateType));

            InitBlock.CallCOM(
                CtorDevice,
                "ID3D11Device",
                "CreateBlendState",
                blendDescVal.GetAddress(),
                InitBlock.GetArrow(CtorThis, blendStateField).GetAddress());

            DtorBlock.CallCOM(
                DtorBlock.GetArrow(DtorThis, blendStateField),
                "IUnknown",
                "Release");



            // Emit HLSL code for PS

            InitBlock.AppendComment("D3D11 Pixel Shader");

            hlslContext = new EmitContextHLSL(SharedHLSL, Range, this.EmitClass.GetName());

            var entryPointSpan = hlslContext.EntryPointSpan;

            entryPointSpan.WriteLine("void main(");

            bool firstParam = true;

            hlslContext.DeclareConnectorAndBind(
                rasterVertex,
                GetAttribute(fragmentElement, "__rv2f"),
                ref firstParam,
                entryPointSpan);

            hlslContext.DeclareParamAndBind(
                GetAttribute(fragmentElement, "PS_ScreenSpacePosition"),
                "SV_Position",
                ref firstParam,
                entryPointSpan);

            for (int ii = 0; ii < renderTargetCount; ++ii)
            {
                if (!firstParam)
                {
                    entryPointSpan.WriteLine(",");
                }
                firstParam = false;

                var    sourceInfo = _renderTargetSources[ii];
                MidExp exp        = null;
                if (sourceInfo.combinedExp != null)
                {
                    // \todo: Validate other bits and bobs!!!
                    exp = sourceInfo.combinedExp;
                }
                else
                {
                    throw new NotImplementedException();
                }

                entryPointSpan.Write("\tout {1} target{0} : SV_Target{0}", ii,
                                     hlslContext.EmitType(exp.Type));
            }
            entryPointSpan.WriteLine(" )");
            entryPointSpan.WriteLine("{");


            hlslContext.EmitTempRecordCtor(
                entryPointSpan,
                fragmentElement,
                GetAttribute(pixelElement, "__ps2om"));

            var psCullFragmentAttr = GetAttribute(fragmentElement, "PS_CullFragment");

            entryPointSpan.WriteLine("\tif( {0} ) discard;",
                                     hlslContext.EmitAttribRef(psCullFragmentAttr, entryPointSpan));


            for (int ii = 0; ii < renderTargetCount; ++ii)
            {
                var    sourceInfo = _renderTargetSources[ii];
                MidExp exp        = null;
                if (sourceInfo.combinedExp != null)
                {
                    // \todo: Validate other bits and bobs!!!
                    exp = sourceInfo.combinedExp;
                }
                else
                {
                    throw new NotImplementedException();
                }

                entryPointSpan.WriteLine("\ttarget{0} = {1};",
                                         ii,
                                         hlslContext.EmitExp(exp, entryPointSpan));
            }

            entryPointSpan.WriteLine("}");

            hlslContext.EmitConstantBufferDecl();

            //

            EmitShaderSetup(
                hlslContext,
                "ps_5_0",
                "Pixel",
                "PS");
        }
예제 #24
0
 private AttributeInfo DecomposeAttr(
     SourceRange range,
     MidExp exp)
 {
     return(DecomposeAttrImpl(range, (dynamic)exp));
 }
예제 #25
0
 protected IEmitVal EmitExp(MidExp midExp, IEmitBlock block, EmitEnv env)
 {
     return(EmitContext.EmitExp(midExp, block, env));
 }
예제 #26
0
        public MidAttributeDecl CacheAttr(
            MidExp exp,
            MidType type )
        {
            MidAttributeDecl attrDecl = null;
            if( _attrCache.TryGetValue( exp, out attrDecl ) )
                return attrDecl;

            if( exp is MidAttributeRef )
            {
                var attrRef = (MidAttributeRef) exp;
                attrDecl = attrRef.Decl;
                if( attrDecl.Element == this && attrDecl.Exp != null )
                {
                    _attrCache[ exp ] = attrDecl;
                    return attrDecl;
                }
            }

            attrDecl = new MidAttributeDecl(
                _name.Factory.unique( "attr" ),
                this,
                type,
                exp );
            _attrCache[ exp ] = attrDecl;
            AddAttribute( attrDecl );
            return attrDecl;
        }
예제 #27
0
 protected IEmitVal EmitExp(MidExp midExp, IEmitBlock block, EmitEnv env)
 {
     return EmitContext.EmitExp(midExp, block, env);
 }
 private string EmitAttrLit(
     MidExp exp )
 {
     return EmitAttrLitImpl((dynamic)exp);
 }
예제 #29
0
 public MidExp CleanupExp( MidExp exp )
 {
     return exp;
 }
 private int GetIntLit(MidExp exp)
 {
     if (exp is MidLit)
         return ((MidLit<Int32>)exp).Value;
     else if (exp is MidAttributeRef)
         return GetIntLit(((MidAttributeRef)exp).Decl.Exp);
     else
         throw new NotImplementedException();
 }
예제 #31
0
        private bool MightHaveSideEffects(
            MidExp exp )
        {
            bool result = false;
            var transform = new MidTransform(
                (e) =>
                {
                    if (e is MidAssignExp)
                        result = true;
                    if (e is MidBreakExp)
                        result = true;
                    if (e is MidIfExp)
                        result = true;
                    if (e is MidForExp)
                        result = true;
                    if (e is MidBuiltinApp)
                    {
                        // \todo: Need a *huge* fix for this. Stdlib functions that might
                        // have side-effects need to be marked in some way to avoid this kind of thing... :(
                        var app = (MidBuiltinApp)e;
                        if (app.Decl.Name.ToString() == "Append")
                            result = true;
                    }
                    return e;
                });

            transform.Transform(exp);

            return result;
        }
 private AttrInfo DecomposeAttr(
     MidExp exp,
     DecomposeAttrContext context)
 {
     return DecomposeAttrImpl((dynamic)exp, context);
 }
 private AttributeInfo DecomposeAttr(
     SourceRange range,
     MidExp exp)
 {
     return DecomposeAttrImpl(range, (dynamic)exp);
 }
        private void SetSource(
            ref MidExp srcExp,
            MidAttributeDecl attr)
        {
            if( srcExp != null )
            {
                if (srcExp is MidAttributeRef)
                {
                    var srcAttr = ((MidAttributeRef)srcExp).Decl;
                    if (srcAttr != attr)
                    {
                        throw OperationTooComplexError(srcExp.Range);
                    }
                }
                else
                {
                    throw OperationTooComplexError(srcExp.Range);
                }
            }

            srcExp = new MidAttributeRef(attr.Range, attr, new LazyFactory());
        }
예제 #35
0
 private MidExp SimplifyExpImpl(MidExp exp, SimplifyEnv env)
 {
     return exp;
 }
예제 #36
0
        private MidExp SimplifyExp(MidExp exp, SimplifyEnv env)
        {
            if (exp == null)
                return null;

            var transform = new MidTransform(
                null, // no pre-transform
                (e) => SimplifyExpImpl((dynamic)e, env));
            return transform.Transform(exp);
        }
 private AttributeInfo DecomposeAttrImpl(
     SourceRange range,
     MidExp exp)
 {
     throw OperationTooComplex(exp.Range);
 }