private void LoadSampler(MojoShader.MOJOSHADER_symbol sym, ActiveUniformType type) { MojoShader.MOJOSHADER_sampler s = new MojoShader.MOJOSHADER_sampler(); s.index = (int)sym.register_index; s.name = sym.name; s.texbem = 0; s.type = getSamplerType(UniformTypeInfos.getBaseType(type)); Samplers.Add(s); }
private static DXEffectObject.d3dx_parameter GetParameterFromSymbol(MojoShader.MOJOSHADER_symbol symbol) { var param = new DXEffectObject.d3dx_parameter(); param.rows = symbol.info.rows; param.columns = symbol.info.columns; param.name = symbol.name ?? string.Empty; param.semantic = string.Empty; // TODO: How do i do this with only MojoShader? var registerSize = (symbol.register_set == MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_BOOL ? 1 : 4) * 4; var offset = (int)symbol.register_index * registerSize; param.bufferOffset = offset; switch (symbol.info.parameter_class) { case MojoShader.MOJOSHADER_symbolClass.MOJOSHADER_SYMCLASS_SCALAR: param.class_ = DXEffectObject.D3DXPARAMETER_CLASS.SCALAR; break; case MojoShader.MOJOSHADER_symbolClass.MOJOSHADER_SYMCLASS_VECTOR: param.class_ = DXEffectObject.D3DXPARAMETER_CLASS.VECTOR; break; case MojoShader.MOJOSHADER_symbolClass.MOJOSHADER_SYMCLASS_MATRIX_COLUMNS: param.class_ = DXEffectObject.D3DXPARAMETER_CLASS.MATRIX_COLUMNS; break; default: throw new Exception("Unsupported parameter class!"); } switch (symbol.info.parameter_type) { case MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_BOOL: param.type = DXEffectObject.D3DXPARAMETER_TYPE.BOOL; break; case MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_FLOAT: param.type = DXEffectObject.D3DXPARAMETER_TYPE.FLOAT; break; case MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_INT: param.type = DXEffectObject.D3DXPARAMETER_TYPE.INT; break; default: throw new Exception("Unsupported parameter type!"); } // HACK: We don't have real default parameters from mojoshader! param.data = new byte[param.rows * param.columns * 4]; param.member_count = symbol.info.member_count; param.element_count = symbol.info.elements > 1 ? symbol.info.elements : 0; if (param.member_count > 0) { param.member_handles = new DXEffectObject.d3dx_parameter[param.member_count]; var members = DXHelper.UnmarshalArray <MojoShader.MOJOSHADER_symbol>( symbol.info.members, (int)symbol.info.member_count); for (var i = 0; i < param.member_count; i++) { var mparam = GetParameterFromSymbol(members[i]); param.member_handles[i] = mparam; } } else { param.member_handles = new DXEffectObject.d3dx_parameter[param.element_count]; for (var i = 0; i < param.element_count; i++) { var mparam = new DXEffectObject.d3dx_parameter(); mparam.name = string.Empty; mparam.semantic = string.Empty; mparam.type = param.type; mparam.class_ = param.class_; mparam.rows = param.rows; mparam.columns = param.columns; mparam.data = new byte[param.columns * param.rows * 4]; param.member_handles[i] = mparam; } } return(param); }
private void LoadUniforms() { Symbols = new List <MojoShader.MOJOSHADER_symbol>(); Samplers = new List <MojoShader.MOJOSHADER_sampler>(); int count = 0; GL.GetProgram(program, GetProgramParameterName.ActiveUniforms, out count); int maxNameLength = 0; GL.GetProgram(program, GetProgramParameterName.ActiveUniformMaxLength, out maxNameLength); StringBuilder nameData = new StringBuilder(maxNameLength); for (int uni = 0; uni < count; ++uni) { int arraySize = 0; ActiveUniformType type; int actLen = 0; GL.GetActiveUniform(program, uni, maxNameLength, out actLen, out arraySize, out type, nameData); string name = nameData.ToString(); uint elementSize = UniformTypeInfos.getElementSize(type); MojoShader.MOJOSHADER_symbol sym = new MojoShader.MOJOSHADER_symbol(); sym.name = name; sym.info = new MojoShader.MOJOSHADER_symbolTypeInfo(); sym.info.elements = (uint)arraySize; sym.info.columns = UniformTypeInfos.getColumnCount(type); sym.info.rows = UniformTypeInfos.getElementCount(type, UniformTypeInfos.getBaseType(type)) / sym.info.columns; sym.info.members = IntPtr.Zero; sym.info.member_count = 0; sym.info.parameter_class = getSymbolClass(type); //TODO: sym.info.parameter_type = getSymbolType(type); //TODO: sym.register_index = (uint)GL.GetUniformLocation(program, name); sym.register_count = (uint)arraySize * (uint)Math.Ceiling(elementSize / 4.0f); ActiveUniformType baseType = UniformTypeInfos.getBaseType(type); if (baseType == ActiveUniformType.Bool) { sym.register_set = MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_BOOL; } else if (baseType == ActiveUniformType.Float) { sym.register_set = MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_FLOAT4; } else if (baseType == ActiveUniformType.Int || baseType == ActiveUniformType.UnsignedInt) { sym.register_set = MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_INT4; } else { sym.register_set = MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_SAMPLER; } Symbols.Add(sym); if (sym.register_set == MojoShader.MOJOSHADER_symbolRegisterSet.MOJOSHADER_SYMREGSET_SAMPLER) { LoadSampler(sym, type); } //TODO: add to list nameData.Clear(); } }