One more small step toward libGL.so renderer API.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17486 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin
2006-05-16 21:27:20 +00:00
parent 73dacb878d
commit c1a34c9be2
3 changed files with 61 additions and 20 deletions
+11
View File
@@ -1,5 +1,16 @@
#include "GLRenderer.h" #include "GLRenderer.h"
void BGLRenderer::Acquire()
{
atomic_add(&fRefCount, 1);
}
void BGLRenderer::Release()
{
if (atomic_add(&fRefCount, -1) < 1)
delete this;
}
void BGLRenderer::LockGL() void BGLRenderer::LockGL()
{ {
} }
+13 -4
View File
@@ -14,11 +14,11 @@ class BGLRenderer
BGLRenderer & operator=(const BGLRenderer &); BGLRenderer & operator=(const BGLRenderer &);
public: public:
BGLRenderer(BGLView *view, BGLDispatcher *dispatcher); BGLRenderer(BGLView *view, ulong bgl_options, BGLDispatcher *dispatcher);
virtual ~BGLRenderer(); virtual ~BGLRenderer();
status_t Acquire(); void Acquire();
status_t Release(); void Release();
void LockGL(); void LockGL();
void UnlockGL(); void UnlockGL();
@@ -39,8 +39,17 @@ public:
void DirectConnected( direct_buffer_info *info ); void DirectConnected( direct_buffer_info *info );
void EnableDirectMode( bool enabled ); void EnableDirectMode( bool enabled );
inline int32 ReferenceCount() { return fRefCount; };
inline ulong Options() { return fOptions; };
inline BGLView * GLView() { return fView; };
inline BGLDispatcher * GLDispatcher() { return fDispatcher; };
private: private:
uint32 fRefCount; volatile int32 fRefCount; // How much we're still usefull?
BGLView * fView; // Never forget who is the boss!
ulong fOptions; // Keep that tune in memory
BGLDispatcher * fDispatcher; // Our personal OpenGL API call dispatcher
}; };
extern "C" _EXPORT BGLRenderer * instanciate_gl_renderer(BGLView *view, BGLDispatcher *dispatcher); extern "C" _EXPORT BGLRenderer * instanciate_gl_renderer(BGLView *view, BGLDispatcher *dispatcher);
+37 -16
View File
@@ -34,16 +34,20 @@ BGLView::BGLView(BRect rect, char *name, ulong resizingMode, ulong mode, ulong o
: BView(rect, name, B_FOLLOW_ALL_SIDES, mode | B_WILL_DRAW | B_FRAME_EVENTS), // | B_FULL_UPDATE_ON_RESIZE) : BView(rect, name, B_FOLLOW_ALL_SIDES, mode | B_WILL_DRAW | B_FRAME_EVENTS), // | B_FULL_UPDATE_ON_RESIZE)
fRenderer(NULL) fRenderer(NULL)
{ {
// TODO: get a renderer instance!
} }
BGLView::~BGLView() BGLView::~BGLView()
{ {
delete fRenderer; if (fRenderer)
fRenderer->Release();
} }
void BGLView::LockGL() void BGLView::LockGL()
{ {
// TODO: acquire the OpenGL API lock it on this glview
if (fRenderer) if (fRenderer)
fRenderer->LockGL(); fRenderer->LockGL();
} }
@@ -52,6 +56,8 @@ void BGLView::UnlockGL()
{ {
if (fRenderer) if (fRenderer)
fRenderer->UnlockGL(); fRenderer->UnlockGL();
// TODO: release the GL API lock to others glviews
} }
void BGLView::SwapBuffers() void BGLView::SwapBuffers()
@@ -72,34 +78,37 @@ BView * BGLView::EmbeddedView()
status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest) status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest)
{ {
if (!fRenderer)
return B_ERROR;
if (! dest || ! dest->Bounds().IsValid()) if (! dest || ! dest->Bounds().IsValid())
return B_BAD_VALUE; return B_BAD_VALUE;
if (fRenderer) return fRenderer->CopyPixelsOut(source, dest);
return fRenderer->CopyPixelsOut(source, dest);
return B_ERROR;
} }
status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest) status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest)
{ {
if (!fRenderer)
return B_ERROR;
if (! source || ! source->Bounds().IsValid()) if (! source || ! source->Bounds().IsValid())
return B_BAD_VALUE; return B_BAD_VALUE;
if (fRenderer) return fRenderer->CopyPixelsIn(source, dest);
return fRenderer->CopyPixelsIn(source, dest);
return B_ERROR;
} }
/* Mesa's GLenum is not ulong but uint, so we can't use GLenum
void BGLView::ErrorCallback(unsigned long errorCode) // Mesa's GLenum is not ulong but uint! without breaking this method signature.
Instead, we have to use the effective BeOS's SGI OpenGL GLenum type:
unsigned long.
*/
void BGLView::ErrorCallback(unsigned long errorCode)
{ {
char msg[32]; char msg[32];
sprintf(msg, "GL: Error code $%04lx.", errorCode); sprintf(msg, "GL: Error code $%04lx.", errorCode);
// debugger(msg); // TODO: under BeOS R5, it call debugger(msg);
fprintf(stderr, "%s\n", msg); fprintf(stderr, "%s\n", msg);
return;
} }
void BGLView::Draw(BRect updateRect) void BGLView::Draw(BRect updateRect)
@@ -130,21 +139,33 @@ void BGLView::AttachedToWindow()
void BGLView::AllAttached() void BGLView::AllAttached()
{ {
BView::AllAttached(); BView::AllAttached();
if (fRenderer)
fRenderer->AllAttached();
} }
void BGLView::DetachedFromWindow() void BGLView::DetachedFromWindow()
{ {
if (fRenderer)
fRenderer->DetachedFromWindow();
BView::DetachedFromWindow(); BView::DetachedFromWindow();
} }
void BGLView::AllDetached() void BGLView::AllDetached()
{ {
if (fRenderer)
fRenderer->AllDetached();
BView::AllDetached(); BView::AllDetached();
} }
void BGLView::FrameResized(float width, float height) void BGLView::FrameResized(float width, float height)
{ {
return BView::FrameResized(width, height); if (fRenderer)
fRenderer->FrameResized(width, height);
BView::FrameResized(width, height);
} }
status_t BGLView::Perform(perform_code d, void *arg) status_t BGLView::Perform(perform_code d, void *arg)
@@ -229,13 +250,13 @@ void BGLView::DirectConnected( direct_buffer_info *info )
#endif #endif
if (fRenderer) if (fRenderer)
return fRenderer->DirectConnected(info); fRenderer->DirectConnected(info);
} }
void BGLView::EnableDirectMode( bool enabled ) void BGLView::EnableDirectMode( bool enabled )
{ {
if (fRenderer) if (fRenderer)
return fRenderer->EnableDirectMode(enabled); fRenderer->EnableDirectMode(enabled);
} }