public bool Setup(RawMemoryBlock _block, ResourceViewParamReader paramReader) { // load source data var words = _block.LoadAllDataAs32BE(); if (words == null) { return(false); } // source memory block _MemoryBlock = _block; // shader type var isPixelShader = (paramReader.Param(0) == "pixelshader"); // decompile shader _Shader = GPUShader.Decompile(isPixelShader, words); if (_Shader == null) { return(false); } // valid shader ShowCode(); return(true); }
public GPUShader DecompileShader(bool pixel, RawMemoryBlock block) { // local search foreach (var entry in _Entries) { if (entry._Pixel == pixel && entry._RawMemory == block) { return(entry._Shader); } } // convert memory GPUShader shader = null; { var words = block.LoadAllDataAs32BE(); try { shader = GPUShader.Decompile(pixel, words); } catch (Exception) { } } // create new entry GPUShaderCacheEntry newEntry = new GPUShaderCacheEntry(); newEntry._Pixel = pixel; newEntry._RawMemory = block; newEntry._Shader = shader; _Entries.Add(newEntry); return(shader); }
public GPUStateCapture(GPUState captureFrom) { _RegValues = new UInt32[captureFrom.RegValues.Length]; for (UInt32 i = 0; i < _RegValues.Length; ++i) { _RegValues[i] = captureFrom.RegValues[i]; } _PixelShader = captureFrom.PixelShader; _VertexShader = captureFrom.VertexShader; }
private void RefreshUsedConsts(GPUShader shader, GPUStateCapture state, ListView view) { view.BeginUpdate(); view.Items.Clear(); foreach (UInt32 baseRegIndex in shader.UsedRegisters) { var item = new ListViewItem(); item.Text = baseRegIndex.ToString(); var stateRegOffset = baseRegIndex + (shader.PixelShader ? 256U : 0); var stateRegIndex = (UInt32)GPURegisterName.SHADER_CONSTANT_000_X + (4 * stateRegOffset); var varR = GPUExecutor.ToFloat(state.Reg(stateRegIndex + 0)); var varG = GPUExecutor.ToFloat(state.Reg(stateRegIndex + 1)); var varB = GPUExecutor.ToFloat(state.Reg(stateRegIndex + 2)); var varA = GPUExecutor.ToFloat(state.Reg(stateRegIndex + 3)); item.SubItems.Add(varR.ToString()); item.SubItems.Add(varG.ToString()); item.SubItems.Add(varB.ToString()); item.SubItems.Add(varA.ToString()); if (((varR >= 0.0f) && (varR <= 1.0f)) && ((varG >= 0.0f) && (varG <= 1.0f)) && ((varB >= 0.0f) && (varB <= 1.0f)) && ((varA >= 0.0f) && (varA <= 1.0f))) { string txt = String.Format("0x{0:X2}{1:X2}{2:X2}{3:X2}", (int)(varR * 255.0f), (int)(varG * 255.0f), (int)(varB * 255.0f), (int)(varA * 255.0f)); item.SubItems.Add(txt); var colorItem = item.SubItems.Add(" "); colorItem.BackColor = Color.FromArgb((int)(varR * 255.0f), (int)(varG * 255.0f), (int)(varB * 255.0f)); item.UseItemStyleForSubItems = false; } else { item.SubItems.Add("-"); item.SubItems.Add("-"); } view.Items.Add(item); } view.EndUpdate(); view.Refresh(); }