diff --git a/lib/MojoShader-CS b/lib/MojoShader-CS index 5421230..e39311f 160000 --- a/lib/MojoShader-CS +++ b/lib/MojoShader-CS @@ -1 +1 @@ -Subproject commit 54212309dedb163a05092fc0ed6ef5bf8bba35da +Subproject commit e39311fefe3fd735ddb2a2dc9be4cc14278151fd diff --git a/src/Graphics/Effect/Effect.cs b/src/Graphics/Effect/Effect.cs index 7228812..7cf82f1 100644 --- a/src/Graphics/Effect/Effect.cs +++ b/src/Graphics/Effect/Effect.cs @@ -1022,21 +1022,21 @@ namespace Microsoft.Xna.Framework.Graphics for (int i = 0; i < effectPtr->param_count; i += 1) { MojoShader.MOJOSHADER_effectParam param = paramPtr[i]; - if ( param.value.value_type == MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_VERTEXSHADER || - param.value.value_type == MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_PIXELSHADER ) + if ( param.value.type.parameter_type == MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_VERTEXSHADER || + param.value.type.parameter_type == MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_PIXELSHADER ) { // Skip shader objects... continue; } - else if ( param.value.value_type >= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_SAMPLER && - param.value.value_type <= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_SAMPLERCUBE ) + else if ( param.value.type.parameter_type >= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_SAMPLER && + param.value.type.parameter_type <= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_SAMPLERCUBE ) { string textureName = String.Empty; MojoShader.MOJOSHADER_effectSamplerState* states = (MojoShader.MOJOSHADER_effectSamplerState*) param.value.values; for (int j = 0; j < param.value.value_count; j += 1) { - if ( states[j].value.value_type >= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_TEXTURE && - states[j].value.value_type <= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_TEXTURECUBE ) + if ( states[j].value.type.parameter_type >= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_TEXTURE && + states[j].value.type.parameter_type <= MojoShader.MOJOSHADER_symbolType.MOJOSHADER_SYMTYPE_TEXTURECUBE ) { MojoShader.MOJOSHADER_effectObject *objectPtr = (MojoShader.MOJOSHADER_effectObject*) effectPtr->objects; int* index = (int*) states[j].value.values; @@ -1059,15 +1059,50 @@ namespace Microsoft.Xna.Framework.Graphics } continue; } + + EffectParameterCollection structMembers = null; + if (param.value.type.member_count > 0) + { + List memList = new List(); + unsafe + { + MojoShader.MOJOSHADER_symbolStructMember* mem; + IntPtr curOffset = IntPtr.Zero; + for (int j = 0; j < param.value.type.member_count; j += 1) + { + mem = (MojoShader.MOJOSHADER_symbolStructMember*) param.value.type.members; + memList.Add(new EffectParameter( + Marshal.PtrToStringAnsi(mem->name), + null, + (int) mem->info.rows, + (int) mem->info.columns, + (int) mem->info.elements, + XNAClass[(int) param.value.type.parameter_class], + XNAType[(int) param.value.type.parameter_type], + null, // FIXME: Nested structs! -flibit + null, + curOffset + )); + uint memSize = mem->info.rows + mem->info.columns; + if (mem->info.elements > 0) + { + memSize *= mem->info.elements; + } + curOffset += (int) memSize * 4; + } + } + structMembers = new EffectParameterCollection(memList); + } + parameters.Add(new EffectParameter( Marshal.PtrToStringAnsi(param.value.name), Marshal.PtrToStringAnsi(param.value.semantic), - (int) param.value.row_count, - (int) param.value.column_count, - (int) param.value.element_count, - XNAClass[(int) param.value.value_class], - XNAType[(int) param.value.value_type], - null, // FIXME: See mojoshader_effects.c:readvalue -flibit + (int) param.value.type.rows, + (int) param.value.type.columns, + (int) param.value.type.elements, + XNAClass[(int) param.value.type.parameter_class], + XNAType[(int) param.value.type.parameter_type], + structMembers, INTERNAL_readAnnotations( param.annotations, param.annotation_count diff --git a/src/Graphics/Effect/EffectParameter.cs b/src/Graphics/Effect/EffectParameter.cs index f73bfad..dafece6 100644 --- a/src/Graphics/Effect/EffectParameter.cs +++ b/src/Graphics/Effect/EffectParameter.cs @@ -110,6 +110,39 @@ namespace Microsoft.Xna.Framework.Graphics List elements = new List(elementCount); for (int i = 0; i < elementCount; i += 1) { + EffectParameterCollection elementMembers = null; + if (structureMembers != null) + { + List memList = new List(); + int curOffset = 0; + for (int j = 0; j < structureMembers.Count; j += 1) + { + int memElems = 0; + if (structureMembers[j].Elements != null) + { + memElems = structureMembers[j].Elements.Count; + } + memList.Add(new EffectParameter( + structureMembers[j].Name, + structureMembers[j].Semantic, + structureMembers[j].RowCount, + structureMembers[j].ColumnCount, + memElems, + structureMembers[j].ParameterClass, + structureMembers[j].ParameterType, + null, // FIXME: Nested structs! -flibit + structureMembers[j].Annotations, + new IntPtr(data.ToInt64() + (j * 4 * curOffset)) + )); + int memSize = structureMembers[j].RowCount * structureMembers[j].ColumnCount; + if (memElems > 0) + { + memSize *= memElems; + } + curOffset += memSize; + } + elementMembers = new EffectParameterCollection(memList); + } // FIXME: Probably incomplete? -flibit elements.Add(new EffectParameter( null, @@ -119,10 +152,10 @@ namespace Microsoft.Xna.Framework.Graphics 0, ParameterClass, parameterType, - null, // FIXME: See mojoshader_effects.c:readvalue -flibit + elementMembers, null, new IntPtr( - data.ToInt64() + (i * rowCount * columnCount) + data.ToInt64() + (i * 4 * rowCount * columnCount) ) )); }