예제 #1
0
        internal static unsafe        ReflectBlockVariable[] ToManaged(SpirvReflectNative.SpvReflectBlockVariable **push_consts, uint var_count)
        {
            ReflectBlockVariable[] blockVars = new ReflectBlockVariable[var_count];

            for (int i = 0; i < var_count; i++)
            {
                var blockVarNative            = push_consts[i];
                var block                     = *blockVarNative;
                ReflectBlockVariable variable = new ReflectBlockVariable();

                PopulateReflectBlockVariable(ref block, ref variable);
                variable.Members = ToManagedArray(block.members, block.member_count);

                blockVars[i] = variable;
            }

            return(blockVars);
        }
예제 #2
0
        public unsafe ReflectBlockVariable[] EnumeratePushConstants()
        {
            fixed(SpirvReflectNative.SpvReflectShaderModule *inmodule = &NativeShaderModule)
            {
                uint var_count = 0;
                var  result    = SpirvReflectNative.spvReflectEnumeratePushConstants(inmodule, &var_count, null);

                SpirvReflectUtils.Assert(result == SpirvReflectNative.SpvReflectResult.SPV_REFLECT_RESULT_SUCCESS);

                SpirvReflectNative.SpvReflectBlockVariable **push_consts =
                    stackalloc SpirvReflectNative.SpvReflectBlockVariable *[(int)(var_count * sizeof(SpirvReflectNative.SpvReflectBlockVariable))];

                result = SpirvReflectNative.spvReflectEnumeratePushConstants(inmodule, &var_count, push_consts);
                SpirvReflectUtils.Assert(result == SpirvReflectNative.SpvReflectResult.SPV_REFLECT_RESULT_SUCCESS);

                // Convert to managed
                return(ReflectBlockVariable.ToManaged(push_consts, var_count));
            }
        }