//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
//**************** Copyright (c) 2016 Marko Pintera (marko.pintera@gmail.com). All rights reserved. **********************//
#pragma once

#include "BsCorePrerequisites.h"

namespace BansheeEngine
{
	/** @addtogroup RenderAPI-Internal
	 *  @{
	 */

	/**
	 * Represents a GPU query that gets triggered when GPU starts processing the query.
	 * 			
	 * @note	
	 * Normally GPU will have many commands in its command buffer. When begin() is called it is placed in that command 
	 * buffer. Once the buffer empties and GPU reaches the EventQuery command, the query callback is triggered.
	 * @note			
	 * Core thread only.
	 */
	class BS_CORE_EXPORT EventQuery
	{
	public:
		EventQuery()
			:mActive(false) {}
		virtual ~EventQuery() {}

		/**
		 * Starts the query. 
		 * 			
		 * @note	
		 * Once the query is started you may poll isReady() method to check when query has finished, or you may hook up 
		 * an #onTriggered callback and be notified that way.
		 */
		virtual void begin() = 0;

		/** Check if GPU has processed the query. */
		virtual bool isReady() const = 0;

		/**	Triggered when GPU starts processing the query. */
		Event<void()> onTriggered;

		/**	Creates a new query, but does not schedule it on GPU. */
		static SPtr<EventQuery> create();

	protected:
		friend class QueryManager;

		/**	Returns true if the has still not been completed by the GPU. */
		bool isActive() const { return mActive; }
		void setActive(bool active) { mActive = active; }

	protected:
		bool mActive;
	};

	/** @} */
}