From c1a34c9be2375fdad1504e3036491ed8ae84ee26 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Tue, 16 May 2006 21:27:20 +0000 Subject: [PATCH] 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 --- src/kits/opengl/GLRenderer.cpp | 11 +++++++ src/kits/opengl/GLRenderer.h | 17 ++++++++--- src/kits/opengl/GLView.cpp | 53 ++++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/kits/opengl/GLRenderer.cpp b/src/kits/opengl/GLRenderer.cpp index 3b0fcd8362..20c11290f0 100644 --- a/src/kits/opengl/GLRenderer.cpp +++ b/src/kits/opengl/GLRenderer.cpp @@ -1,5 +1,16 @@ #include "GLRenderer.h" +void BGLRenderer::Acquire() +{ + atomic_add(&fRefCount, 1); +} + +void BGLRenderer::Release() +{ + if (atomic_add(&fRefCount, -1) < 1) + delete this; +} + void BGLRenderer::LockGL() { } diff --git a/src/kits/opengl/GLRenderer.h b/src/kits/opengl/GLRenderer.h index 9b268bb271..0d8fe47161 100644 --- a/src/kits/opengl/GLRenderer.h +++ b/src/kits/opengl/GLRenderer.h @@ -14,11 +14,11 @@ class BGLRenderer BGLRenderer & operator=(const BGLRenderer &); public: - BGLRenderer(BGLView *view, BGLDispatcher *dispatcher); + BGLRenderer(BGLView *view, ulong bgl_options, BGLDispatcher *dispatcher); virtual ~BGLRenderer(); - status_t Acquire(); - status_t Release(); + void Acquire(); + void Release(); void LockGL(); void UnlockGL(); @@ -39,8 +39,17 @@ public: void DirectConnected( direct_buffer_info *info ); 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: - 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); diff --git a/src/kits/opengl/GLView.cpp b/src/kits/opengl/GLView.cpp index f757eeae6f..e14085c344 100644 --- a/src/kits/opengl/GLView.cpp +++ b/src/kits/opengl/GLView.cpp @@ -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) fRenderer(NULL) { + // TODO: get a renderer instance! } BGLView::~BGLView() { - delete fRenderer; + if (fRenderer) + fRenderer->Release(); } void BGLView::LockGL() { + // TODO: acquire the OpenGL API lock it on this glview + if (fRenderer) fRenderer->LockGL(); } @@ -52,6 +56,8 @@ void BGLView::UnlockGL() { if (fRenderer) fRenderer->UnlockGL(); + + // TODO: release the GL API lock to others glviews } void BGLView::SwapBuffers() @@ -72,34 +78,37 @@ BView * BGLView::EmbeddedView() status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest) { + if (!fRenderer) + return B_ERROR; + if (! dest || ! dest->Bounds().IsValid()) return B_BAD_VALUE; - if (fRenderer) - return fRenderer->CopyPixelsOut(source, dest); - - return B_ERROR; + return fRenderer->CopyPixelsOut(source, dest); } status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest) { + if (!fRenderer) + return B_ERROR; + if (! source || ! source->Bounds().IsValid()) return B_BAD_VALUE; - if (fRenderer) - return fRenderer->CopyPixelsIn(source, dest); - - return B_ERROR; + return fRenderer->CopyPixelsIn(source, dest); } - -void BGLView::ErrorCallback(unsigned long errorCode) // Mesa's GLenum is not ulong but uint! +/* Mesa's GLenum is not ulong but uint, so we can't use GLenum + 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]; sprintf(msg, "GL: Error code $%04lx.", errorCode); - // debugger(msg); + // TODO: under BeOS R5, it call debugger(msg); fprintf(stderr, "%s\n", msg); - return; } void BGLView::Draw(BRect updateRect) @@ -130,21 +139,33 @@ void BGLView::AttachedToWindow() void BGLView::AllAttached() { BView::AllAttached(); + + if (fRenderer) + fRenderer->AllAttached(); } void BGLView::DetachedFromWindow() { + if (fRenderer) + fRenderer->DetachedFromWindow(); + BView::DetachedFromWindow(); } void BGLView::AllDetached() { + if (fRenderer) + fRenderer->AllDetached(); + BView::AllDetached(); } 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) @@ -229,13 +250,13 @@ void BGLView::DirectConnected( direct_buffer_info *info ) #endif if (fRenderer) - return fRenderer->DirectConnected(info); + fRenderer->DirectConnected(info); } void BGLView::EnableDirectMode( bool enabled ) { if (fRenderer) - return fRenderer->EnableDirectMode(enabled); + fRenderer->EnableDirectMode(enabled); }