/*
 * Copyright 2006, Philippe Houdoin. All rights reserved.
 * Distributed under the terms of the MIT License.

 * This header defines BGLRenderer, the base class making up
 * the Haiku GL renderer add-ons (essentially selfcontained C++
 * shared libraries that do the actual rendering such as
 * libswpipe.so and libswrast.so)
 */
#ifndef GLRENDERER_H
#define GLRENDERER_H


#include <BeBuild.h>
#include <GLView.h>


class BGLDispatcher;
class GLRendererRoster;

typedef unsigned long renderer_id;

class BGLRenderer
{
							// Private unimplemented copy constructors
							BGLRenderer(const BGLRenderer &);
							BGLRenderer & operator=(const BGLRenderer &);

public:
							BGLRenderer(BGLView *view, ulong bgl_options,
								BGLDispatcher *dispatcher);
	virtual					~BGLRenderer();

	void 					Acquire();
	void					Release();

	virtual void			LockGL();
	virtual void 			UnlockGL();

	virtual	void 			SwapBuffers(bool VSync = false);
	virtual	void			Draw(BRect updateRect);
	virtual status_t		CopyPixelsOut(BPoint source, BBitmap *dest);
	virtual status_t    	CopyPixelsIn(BBitmap *source, BPoint dest);

	virtual void			FrameResized(float width, float height);

	virtual void			DirectConnected(direct_buffer_info *info);
	virtual void			EnableDirectMode(bool enabled);

	inline	int32			ReferenceCount() const { return fRefCount; };
	inline	ulong			Options() const { return fOptions; };
	inline	BGLView*		GLView() { return fView; };
	inline	BGLDispatcher*	GLDispatcher() { return fDispatcher; };

private:
	friend class GLRendererRoster;

	virtual status_t		_Reserved_Renderer_0(int32, void *);
	virtual status_t		_Reserved_Renderer_1(int32, void *);
	virtual status_t		_Reserved_Renderer_2(int32, void *);
	virtual status_t		_Reserved_Renderer_3(int32, void *);
	virtual status_t		_Reserved_Renderer_4(int32, void *);

	int32					fRefCount;	// How much we're still useful
	BGLView*				fView;		// Never forget who is the boss!
	ulong					fOptions;	// Keep that tune in memory
	BGLDispatcher*			fDispatcher;// Our personal GL API call dispatcher

	GLRendererRoster*		fOwningRoster;
	renderer_id				fID;
};

extern "C" _EXPORT BGLRenderer* instantiate_gl_renderer(BGLView *view, ulong options, BGLDispatcher *dispatcher);


#endif	// GLRENDERER_H