Example #1
0
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();
}
Example #2
0
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
}