#pragma once

#include "EmberCLPch.h"
#include "OpenCLWrapper.h"
#include "IterOpenCLKernelCreator.h"

/// <summary>
/// RendererClDevice class.
/// </summary>

namespace EmberCLns
{
/// <summary>
/// Class to manage a device that does the iteration portion of
/// the rendering process. Having a separate class for this purpose
/// enables multi-GPU support.
/// </summary>
class EMBERCL_API RendererClDevice : public EmberReport
{
public:
	RendererClDevice(size_t platform, size_t device, bool shared);
	bool Init();
	bool Ok() const noexcept;
	bool Shared() const noexcept;
	bool Nvidia() const noexcept;
	size_t WarpSize() const noexcept;
	size_t PlatformIndex() const noexcept;
	size_t DeviceIndex() const noexcept;

	//Public virtual functions overridden from base classes.
	void ClearErrorReport() noexcept override;
	string ErrorReportString() override;
	vector<string> ErrorReport() override;

	size_t m_Calls;
	OpenCLWrapper m_Wrapper;

private:
	bool m_Init;
	bool m_Shared;
	bool m_NVidia;
	size_t m_WarpSize;
	size_t m_PlatformIndex;
	size_t m_DeviceIndex;
	shared_ptr<OpenCLInfo> m_Info;
};
}