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

#ifdef GD_D3D10

#include <Darkstar/Graphic System/Effect/constant_buffer_d3d10.hpp>
#include <Darkstar/Graphic System/Direct3D/graphicDriver.hpp>
#include <Darkstar/Kernel/logh.hpp>

using namespace gs;
using ker::Log;

ConstantBuffer::ConstantBuffer()
{
	D3D10_BUFFER_DESC buf_desc;
	buf_desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
	buf_desc.ByteWidth = 4096;
	buf_desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
	buf_desc.MiscFlags = 0;
	buf_desc.Usage = D3D10_USAGE_DYNAMIC;
	if(FAILED(GraphicDriver::ptr()->getDevice()->CreateBuffer(&buf_desc, NULL, &buffer)))
	{
		lwar << "Cannot create constant buffer";
		return;
	};
};

ConstantBuffer::~ConstantBuffer()
{
	if(buffer)
	{
		if(FAILED(buffer->Release()))
		{
			lwar << "Cannot release constant buffer";
			return;
		};
		buffer = NULL;
	};
};

void ConstantBuffer::setConstantsArray(const unsigned int offset, const unsigned int size, const char* data)
{
#ifndef _NOTFINAL
	if(offset < 0 || offset + size >= 4096)
		return;
#endif
	memcpy(&memory_chunk[offset], data, size);
};

void ConstantBuffer::clear()
{
	memset(memory_chunk, 0, 4096);
};

void ConstantBuffer::synchronize()
{
	void* ptr;
	if(FAILED(buffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &ptr)))
	{
		lwar << "Cannot synchronize constant buffer";
		return;
	};
	memcpy(ptr, memory_chunk, 4096);
	buffer->Unmap();
};

ID3D10Buffer* ConstantBuffer::getBuffer() const
{
	return buffer;
};

#endif