#include "Renderer.h"
#include "GraphicsPlatformInterface.h"
#include "Direct3D12/D3D12Interface.h"

namespace XEngine::graphics {
namespace {
platform_interface gfx{};

/**
 * @brief 设置图形渲染平台的接口
 * @details 根据指定的平台类型，调用对应的初始化与关闭函数指针
 * @param platform 图形渲染平台类型
 * @return true 如果初始化成功，否则返回 false
 */
bool
set_platform_interface(graphics_platform platform)
{
	switch (platform)
	{
	case graphics_platform::direct3d12:
		d3d12::get_platform_interface(gfx);
		break;
	case graphics_platform::vulkan:
		//vulkan::get_platform_interface(gfx);
		break;
	case graphics_platform::opengl:
		//opengl::get_platform_interface(gfx);
		break;
	default:
		return false;
	}
	return true;
}
}// anonymous namespace

/**
 * @brief 初始化图形渲染平台
 * @details 调用设置平台接口函数，初始化指定的图形渲染平台
 * @param platform 图形渲染平台类型
 * @return true 如果初始化成功，否则返回 false
 */
bool 
initialize(graphics_platform platform)
{
	return set_platform_interface(platform) && gfx.initialize();
}

void 
shutdown()
{
	gfx.shutdown();	
}

surface 
create_surface(platform::window window)
{
	return gfx.surface.create(window);
}

void 
remove_surface(surface_id id)
{
	assert(id::is_valid(id));
	gfx.surface.remove(id);
}

void
surface::resize(u32 width, u32 height) const
{
	assert(is_valid());
	gfx.surface.resize(_id, width, height);
}

u32
surface::width() const
{
	assert(is_valid());
	return gfx.surface.width(_id);
}

u32
surface::height() const
{
	assert(is_valid());
	return gfx.surface.height(_id);
}

void
surface::render() const
{
	assert(is_valid());
	gfx.surface.render(_id);
}

}// namespace XEngine::graphics
