//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007-2008)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: shader_compiler_d3d9.cpp
//      Краткое описание: shader compiler for directx 9
//

#if GD_D3D9

#include <Darkstar/Graphic System/Effect/shader_compiler.hpp>
#include <Darkstar/Kernel/FileSystem/dfile.hpp>
#include <Darkstar/Kernel/logh.hpp>

using ker::Log;
using ker::DFile;
using namespace gs;

bool ShaderCompiler::compileShader(const shared_array<char>& code, const unsigned int size, const shared_array<ShaderMacro>& macros, const std::string& entry_point, const std::string& target)
{
	DWORD flags = D3DXSHADER_PACKMATRIX_ROWMAJOR | D3DXSHADER_AVOID_FLOW_CONTROL;
	ShaderInclude incl;
	ID3DXBuffer* scode;
	ID3DXBuffer* errors;

	std::string d3d9_target = target == "ps_4_0" ? "ps_3_0" : "vs_3_0";
	if(FAILED(D3DXCompileShader(code.get(), size, (D3DXMACRO*)macros.get(), &incl, entry_point.c_str(), d3d9_target.c_str(), flags, &scode, &errors, NULL)))
	{
		lwar << "Cannot compile shader with main function " << entry_point << " and target " << d3d9_target << " errors: " << static_cast<char*>(errors->GetBufferPointer());
		return false;
	};
	if(errors)
	{
		error_data = (char*)errors->GetBufferPointer();
		error_data_size = (unsigned int)errors->GetBufferSize();
	};

	shader_code = scode->GetBufferPointer();
	shader_code_size = (unsigned int)scode->GetBufferSize();
	return true;
};

#endif