void compile_shader(std::string path) { ShaderVar var("r0.yz.x"); var.symplify(); LOG_ERROR(GENERAL, var.get().c_str()); u32 ptr; { wxFile f(path); if (!f.IsOpened()) return; size_t size = f.Length(); vm::ps3::init(); ptr = vm::alloc(size); f.Read(vm::get_ptr(ptr), size); f.Close(); } CgBinaryProgram& prog = vm::get_ref<CgBinaryProgram>(ptr); LOG_ERROR(GENERAL, "%d - %x", (u32)prog.profile, (u32)prog.binaryFormatRevision); std::string shader; GLParamArray param_array; u32 size; if (prog.profile == 7004) { CgBinaryFragmentProgram& fprog = vm::get_ref<CgBinaryFragmentProgram>(ptr + prog.program); u32 ctrl = (fprog.outputFromH0 ? 0 : 0x40) | (fprog.depthReplace ? 0xe : 0); GLFragmentDecompilerThread(shader, param_array, ptr + prog.ucode, size, ctrl).Task(); } else { CgBinaryVertexProgram& vprog = vm::get_ref<CgBinaryVertexProgram>(ptr + prog.program); std::vector<u32> data; be_t<u32>* vdata = vm::get_ptr<be_t<u32>>(ptr + prog.ucode); for (u32 i = 0; i < prog.ucodeSize; ++i, ++vdata) { data.push_back(vdata[i]); } GLVertexDecompilerThread(data, shader, param_array).Task(); } LOG_ERROR(GENERAL, shader.c_str()); vm::close(); }
void GLVertexProgram::Decompile(RSXVertexProgram& prog) { #if 0 GLVertexDecompilerThread(data, shader, parr).Entry(); #else if(m_decompiler_thread) { Wait(); if(m_decompiler_thread->IsAlive()) { m_decompiler_thread->Stop(); } delete m_decompiler_thread; m_decompiler_thread = nullptr; } m_decompiler_thread = new GLVertexDecompilerThread(prog.data, shader, parr); m_decompiler_thread->Start(); #endif }