public ShaderRegisters(SourceShader source, string techniqueName, Platform platform) { AsmTechnique technique = source.GetAsmTechnique(techniqueName, platform); vsReg = technique.VertexShader.RegisterSet; psReg = technique.PixelShader.RegisterSet; if (technique.VertexPreShader != null) { vsPreReg = technique.VertexPreShader.RegisterSet; } if (technique.PixelPreShader != null) { psPreReg = technique.PixelPreShader.RegisterSet; } staticArrays = new Dictionary <string, CodeExpression>(); if (technique.TechniqueExtraData != null) { this.techniqueData = technique.TechniqueExtraData; psDefault = technique.TechniqueExtraData.PixelShaderConstants; vsDefault = technique.TechniqueExtraData.VertexShaderConstants; psBooleanDefault = technique.TechniqueExtraData.PixelShaderBooleanConstants; vsBooleanDefault = technique.TechniqueExtraData.VertexShaderBooleanConstants; } }
private CodeExpression GeneratePreShaderFloatDefaults(TechniqueExtraData defaults, RegisterSet registers, int count, CompileDirectives directives, out int offset) { offset = 0; if (count == 0 || defaults == null) { return(null); } Vector4[] constants = new Vector4[count]; bool set = false; foreach (KeyValuePair <string, Vector4[]> entry in defaults.DefaultSingleValues) { Register reg; if (registers.TryGetRegister(entry.Key, out reg)) { if (reg.Category == RegisterCategory.Float4) { for (int i = 0; i < Math.Max(1, reg.ArraySize) && i < entry.Value.Length && i < count - reg.Index; i++) { constants[i + reg.Index] = entry.Value[i]; set = true; } } } } if (!set) { return(null); } return(InitaliseConstants(count, constants, directives, out offset)); }
public ShaderTextures(SourceShader source, string techniqueName, Platform platform) { this.psSamplers = new List <Register>(); this.vsSamplers = new List <Register>(); this.allSamplers = new Dictionary <string, SharedSampler>(); AsmTechnique technique = source.GetAsmTechnique(techniqueName, platform); TechniqueExtraData extras = technique.TechniqueExtraData; //pull out the textures that will be used textures = new TextureAssociation[extras.TechniqueTextures.Length]; for (int i = 0; i < extras.TechniqueTextures.Length; i++) { textures[i] = new TextureAssociation(extras.TechniqueTextures[i]); } //now do the samplers RegisterSet set = technique.PixelShader.RegisterSet; //pixel first foreach (Register reg in set) { if (reg.Category == RegisterCategory.Sampler) { psSamplers.Add(reg); int textureIndex = extras.PixelSamplerTextureIndex[reg.Index]; if (textureIndex == -1) { ThrowSamplerNoTextureException(reg); } textures[textureIndex].PsSamplers.Add(reg.Index); //add the sampler to 'allSamplers' SharedSampler ss = new SharedSampler(); ss.PsIndex = reg.Index; ss.SamplerDetails = reg; ss.Index = allSamplers.Count; ss.DefaultState = extras.PixelSamplerStates[reg.Index]; allSamplers.Add(reg.Name, ss); } } set = technique.VertexShader.RegisterSet; //now vertex foreach (Register reg in set) { if (reg.Category == RegisterCategory.Sampler) { vsSamplers.Add(reg); int textureIndex = extras.VertexSamplerTextureIndex[reg.Index]; if (textureIndex == -1) { ThrowSamplerNoTextureException(reg); } textures[textureIndex].VsSamplers.Add(reg.Index); //add the sampler to 'allSamplers' SharedSampler ss; if (!allSamplers.TryGetValue(reg.Name, out ss)) { ss = new SharedSampler(); ss.SamplerDetails = reg; ss.Index = allSamplers.Count; ss.DefaultState = extras.VertexSamplerStates[reg.Index]; allSamplers.Add(reg.Name, ss); } ss.VsIndex = reg.Index; } } }