private void DecomposeAttr( MidAttributeDecl midAttrDecl, int index) { DecomposeAttrContext context; context.index = index; context.flavor = AttrCase.Combined; AttrInfo info = DecomposeAttr(midAttrDecl, context); try { var blendDesc = GetTargetBlendDesc(info); _renderTargetBlendDescs[index] = blendDesc; // Do validation stuff - basically, we need to // be sure that whatever expressions get put into // the _renderTargetSources[index] entry are more // or less the "same" source... } catch (D3D11PixelShaderOperationTooComplex) { // error should have been reported when // the exception was thrown } }
public void BindAttribute( MidFacetDecl midFacet, MidAttributeDecl midAttr, Func <IEmitBlock, IEmitVal, IEmitVal> accessor, IEmitType type, string name) { int ii = 0; foreach (var a in midFacet.Attributes) { if (a == midAttr) { Attributes[ii] = new ShaderAttributeInfo { AttributeDecl = midAttr, Accessor = accessor, Type = type, Name = name, }; return; } ++ii; } throw new NotImplementedException(); }
public IEmitVal EmitAttributeRef( MidAttributeDecl decl, IEmitBlock block, EmitEnv env) { if (env.ContainsKey(decl)) { return(env.Lookup(decl, block)); } IEmitVal attributeVal = null; if (decl.Exp != null) { attributeVal = block.Temp( decl.Name.ToString(), EmitExp(decl.Exp, block, env)); } else { // \todo: This is a *huge* hack, // since we use @Constant attributes // to make various D3D constants visible... :( attributeVal = block.BuiltinApp( EmitType(decl.Type, env), decl.Name.ToString(), null); } env.Insert(decl, (b) => attributeVal); return(attributeVal); }
private AttributeInfo DecomposeAttr( SourceRange range, MidAttributeDecl midAttrDecl) { var attrInfo = _info.Cache(midAttrDecl, () => DecomposeAttr(range, midAttrDecl.Exp)); attrInfo.Range = range; return(attrInfo); }
private AttributeInfo TryDecomposeAttr( SourceRange range, MidAttributeDecl midAttrDecl) { try { return(DecomposeAttr(range, midAttrDecl)); } catch (D3D11InputAssemblerOperationTooComplex) { return(null); } }
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()); }
public override void EmitImplSetup() { var uniformElement = GetElement("Uniform"); var iaElement = GetElement("AssembledVertex"); _vertexIDAttr = GetAttribute(iaElement, "IA_VertexID").Attribute; _instanceIDAttr = GetAttribute(iaElement, "IA_InstanceID").Attribute; _info[_vertexIDAttr] = new IndexSourceInfo(_vertexIDAttr.Range) { InputSlotClass = InitBlock.Enum32("D3D11_INPUT_CLASSIFICATION", "D3D11_INPUT_PER_VERTEX_DATA", D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_VERTEX_DATA), StepRate = 0 }; _info[_instanceIDAttr] = new IndexSourceInfo(_instanceIDAttr.Range) { InputSlotClass = InitBlock.Enum32("D3D11_INPUT_CLASSIFICATION", "D3D11_INPUT_PER_INSTANCE_DATA", D3D11_INPUT_CLASSIFICATION.D3D11_INPUT_PER_INSTANCE_DATA), StepRate = 1 }; InitBlock.AppendComment("D3D11 Input Assembler"); var inputElementInits = (from a in iaElement.Attributes where a.IsOutput let name = SharedHLSL.MapName(a) let attrInfo = TryDecomposeAttr(a.Range, a) where attrInfo != null from e in DeclareInputElements(InitBlock, name, attrInfo) select e).ToArray(); if (_inputElementCount != 0) { var inputElementDescsVal = InitBlock.Temp( "inputElementDescs", InitBlock.Array( EmitTarget.GetBuiltinType("D3D11_INPUT_ELEMENT_DESC"), inputElementInits)); var inputLayoutPointerType = EmitTarget.GetOpaqueType("ID3D11InputLayout*"); inputLayoutField = EmitClass.AddPrivateField( inputLayoutPointerType, "_inputLayout"); InitBlock.SetArrow( CtorThis, inputLayoutField, EmitTarget.GetNullPointer(inputLayoutPointerType)); InitBlock.CallCOM( CtorDevice, "ID3D11Device", "CreateInputLayout", inputElementDescsVal.GetAddress(), InitBlock.LiteralU32((UInt32)_inputElementCount), EmitPass.VertexShaderBytecodeVal, EmitPass.VertexShaderBytecodeSizeVal, InitBlock.GetArrow(CtorThis, inputLayoutField).GetAddress()); DtorBlock.CallCOM( DtorBlock.GetArrow(DtorThis, inputLayoutField), "IUnknown", "Release"); } }
private AttrInfo DecomposeAttr( MidAttributeDecl midAttrDecl, DecomposeAttrContext context) { return(DecomposeAttr(midAttrDecl.Exp, context)); }