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:
@@ -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()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user