private void toolLoad_Click(object sender, EventArgs e) { // ask for file var res = openDumpDialog.ShowDialog(); if (res != System.Windows.Forms.DialogResult.OK) { return; } // try to load it var path = openDumpDialog.FileName; var newData = RawDumpData.Load(path); if (newData == null) { MessageBox.Show(this, "Unable to load GPU trace from selected file"); } // close current file if (!CloseCurrent()) { return; } // set new raw view _RawData = newData; // create parsed view _Parsed = ParsedData.Parse(_RawData); // create new data viewer _DataViewer = new ResourceViewCollection(tabDataViews, _RawData); // refresh UI RebuildDrawCallTree(); RefreshPacketDump(); RefreshDrawCallDump(); RefreshRegisterDump(); RefreshStateDump(); }
static public ParsedData Parse(RawDumpData raw) { ParsedData ret = new ParsedData(); var packetsMap = new Dictionary <RawPacket, ParsedPacket>(); // create drawcall list ret._ShaderCache = new GPUShaderCache(); ret._DrawCalls = new List <ParsedDrawCall>(); ret._DrawGroups = new List <ParsedDrawGroup>(); // prepare GPU state for the duration of parsing GPUState parseState = new GPUState(ret._ShaderCache); GPUExecutor parseExec = new GPUExecutor(parseState); // parse all packets int packedIndex = 1; int drawCallIndex = 1; int drawGroupIndex = 1; ParsedDrawCall drawCall = null; ParsedDrawGroup drawGroup = null; foreach (var rawPacket in raw.Packets) { // start new drawcall if (drawCall == null) { drawCall = new ParsedDrawCall(drawCallIndex); ret._DrawCalls.Add(drawCall); drawCallIndex += 1; } // execute packet GPUCommandOutput executeOutput = new GPUCommandOutput(); var executionResult = parseExec.ExecutePacket(rawPacket, executeOutput); if (executionResult != GPUExecutorResult.Invalid) { // add data packetsMap[rawPacket] = ParsedPacket.Parse(rawPacket, packedIndex, drawCall, executeOutput); ++packedIndex; } // restart after each drawcall if (packetsMap[rawPacket].Output.IsDraw()) { // capture final state at each drawcall if (drawCall != null) { drawCall.CapturedState = new GPUStateCapture(parseState); // extract the viewport/render target settings for the draw call - required to match it to the draw group var stateRenderTargets = new GPUStateRenderTargets(drawCall.CapturedState); var stateViewport = new GPUStateCaptureViewport(drawCall.CapturedState); // determine if we should add this draw call to current draw group if ((drawGroup != null) && drawGroup.Compatible(stateViewport, stateRenderTargets)) { drawGroup.AddDrawCall(drawCall); } else { drawGroup = new ParsedDrawGroup(drawGroupIndex++, stateViewport, stateRenderTargets); drawGroup.AddDrawCall(drawCall); ret._DrawGroups.Add(drawGroup); } } // reset drawCall = null; } } return(ret); }