예제 #1
0
        void TryRoundTrip(string sourcePrefix, string compilerSource, byte[] expectedBytes)
        {
            var shaderSourceCode    = sourcePrefix + compilerSource;
            var preprocessorDefines = new CompilerMacro[2];

            preprocessorDefines[0].Name = "XBOX";
            preprocessorDefines[1].Name = "XBOX360";
            var includeHandler = new NopIncludeHandler();
            var options        = CompilerOptions.None;
            var compiledShader = ShaderCompiler.AssembleFromSource(
                shaderSourceCode, preprocessorDefines, includeHandler, options,
                Microsoft.Xna.Framework.TargetPlatform.Xbox360);
            var compiledBytes = compiledShader.GetShaderCode();

            if (compiledBytes == null ||
                compiledBytes.Length != expectedBytes.Length ||
                !MemCmp(compiledBytes, expectedBytes))
            {
                compilerUcodeTextBox.BackColor = System.Drawing.Color.Red;
            }
            else
            {
                compilerUcodeTextBox.BackColor = System.Drawing.SystemColors.Control;
            }
        }
예제 #2
0
파일: Editor.cs 프로젝트: Gh0stBlade/xenia
 void TryRoundTrip(string sourcePrefix, string compilerSource, byte[] expectedBytes) {
   var shaderSourceCode = sourcePrefix + compilerSource;
   var preprocessorDefines = new CompilerMacro[2];
   preprocessorDefines[0].Name = "XBOX";
   preprocessorDefines[0].Name = "XBOX360";
   var includeHandler = new NopIncludeHandler();
   var options = CompilerOptions.None;
   var compiledShader = ShaderCompiler.AssembleFromSource(
       shaderSourceCode, preprocessorDefines, includeHandler, options,
       Microsoft.Xna.Framework.TargetPlatform.Xbox360);
   var compiledBytes = compiledShader.GetShaderCode();
   if (compiledBytes == null ||
       compiledBytes.Length != expectedBytes.Length ||
       !MemCmp(compiledBytes, expectedBytes)) {
     compilerUcodeTextBox.BackColor = System.Drawing.Color.Red;
   } else {
     compilerUcodeTextBox.BackColor = System.Drawing.SystemColors.Control;
   }
 }
예제 #3
0
파일: Editor.cs 프로젝트: Gh0stBlade/xenia
    void Process(string shaderSourceCode) {
      shaderSourceCode += "\ncnop";
      shaderSourceCode += "\ncnop";
      var preprocessorDefines = new CompilerMacro[2];
      preprocessorDefines[0].Name = "XBOX";
      preprocessorDefines[0].Name = "XBOX360";
      var includeHandler = new NopIncludeHandler();
      var options = CompilerOptions.None;
      var compiledShader = ShaderCompiler.AssembleFromSource(
          shaderSourceCode, preprocessorDefines, includeHandler, options,
          Microsoft.Xna.Framework.TargetPlatform.Xbox360);

      var disassembledSourceCode = compiledShader.ErrorsAndWarnings;
      disassembledSourceCode = disassembledSourceCode.Replace("\n", Environment.NewLine);
      if (disassembledSourceCode.IndexOf("// PDB hint 00000000-00000000-00000000") == -1) {
        UpdateTextBox(outputTextBox, disassembledSourceCode, false);
        UpdateTextBox(compilerUcodeTextBox, "", false);
        UpdateTextBox(wordsTextBox, "", false);
        return;
      }
      var prefix = disassembledSourceCode.Substring(
          0, disassembledSourceCode.IndexOf(
                 ':', disassembledSourceCode.IndexOf(':') + 1));
      disassembledSourceCode =
          disassembledSourceCode.Replace(prefix + ": ", "");
      disassembledSourceCode = disassembledSourceCode.Replace(
          "// PDB hint 00000000-00000000-00000000" + Environment.NewLine, "");
      var firstLine = disassembledSourceCode.IndexOf("//");
      var warnings = "// " +
                     disassembledSourceCode.Substring(0, firstLine)
                         .Replace(Environment.NewLine, Environment.NewLine + "// ");
      disassembledSourceCode =
          warnings + disassembledSourceCode.Substring(firstLine + 3);
      disassembledSourceCode = disassembledSourceCode.Trim();
      UpdateTextBox(outputTextBox, disassembledSourceCode, true);

      string shaderType =
          shaderSourceCode.IndexOf("xvs_") == -1 ? "ps" : "vs";
      var ucodeWords = ExtractAndDumpWords(shaderType, compiledShader.GetShaderCode());
      if (ucodeWords != null) {
        TryCompiler(shaderType, ucodeWords);
      } else {
        UpdateTextBox(compilerUcodeTextBox, "", false);
      }

      if (compilerUcodeTextBox.Text.Length > 0) {
        var sourcePrefix = disassembledSourceCode.Substring(0, disassembledSourceCode.IndexOf("/*"));
        TryRoundTrip(sourcePrefix, compilerUcodeTextBox.Text, compiledShader.GetShaderCode());
      }
    }
예제 #4
0
        void Process(string shaderSourceCode)
        {
            if (shaderSourceCode.IndexOf("xvs_3_0") != -1 || shaderSourceCode.IndexOf("xps_3_0") != -1)
            {
                shaderSourceCode += "\ncnop";
                shaderSourceCode += "\ncnop";
            }
            var preprocessorDefines = new CompilerMacro[2];

            preprocessorDefines[0].Name = "XBOX";
            preprocessorDefines[1].Name = "XBOX360";
            var includeHandler = new NopIncludeHandler();
            var options        = CompilerOptions.None;
            var compiledShader = ShaderCompiler.AssembleFromSource(
                shaderSourceCode, preprocessorDefines, includeHandler, options,
                Microsoft.Xna.Framework.TargetPlatform.Xbox360);

            var disassembledSourceCode = compiledShader.ErrorsAndWarnings;

            disassembledSourceCode = disassembledSourceCode.Replace("\n", Environment.NewLine);
            if (disassembledSourceCode.IndexOf("// PDB hint 00000000-00000000-00000000") == -1)
            {
                UpdateTextBox(outputTextBox, disassembledSourceCode, false);
                UpdateTextBox(compilerUcodeTextBox, "", false);
                UpdateTextBox(wordsTextBox, "", false);
                return;
            }
            var prefix = disassembledSourceCode.Substring(
                0, disassembledSourceCode.IndexOf(
                    ':', disassembledSourceCode.IndexOf(':') + 1));

            disassembledSourceCode =
                disassembledSourceCode.Replace(prefix + ": ", "");
            disassembledSourceCode = disassembledSourceCode.Replace(
                "// PDB hint 00000000-00000000-00000000" + Environment.NewLine, "");
            var firstLine = disassembledSourceCode.IndexOf("//");
            var warnings  = "// " +
                            disassembledSourceCode.Substring(0, firstLine)
                            .Replace(Environment.NewLine, Environment.NewLine + "// ");

            disassembledSourceCode =
                warnings + disassembledSourceCode.Substring(firstLine + 3);
            disassembledSourceCode = disassembledSourceCode.Trim();
            UpdateTextBox(outputTextBox, disassembledSourceCode, true);

            string shaderType =
                shaderSourceCode.IndexOf("vs_") == -1 ? "ps" : "vs";
            var ucodeWords = ExtractAndDumpWords(shaderType, compiledShader.GetShaderCode());

            if (ucodeWords != null)
            {
                TryCompiler(shaderType, ucodeWords);
            }
            else
            {
                UpdateTextBox(compilerUcodeTextBox, "", false);
            }

            if (compilerUcodeTextBox.Text.Length > 0)
            {
                var sourcePrefix = disassembledSourceCode.Substring(0, disassembledSourceCode.IndexOf("/*"));
                TryRoundTrip(sourcePrefix, compilerUcodeTextBox.Text, compiledShader.GetShaderCode());
            }
        }