From 473e51f2fbfb003717bb88616ea585fc8d76f75e Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 19 Sep 2002 16:19:43 +0000 Subject: Updated BeOS support (Philippe Houdoin) --- src/mesa/drivers/beos/GLView.cpp | 1725 +++++++++++++++++++++----------------- src/mesa/main/Makefile.BeOS-R5 | 452 ++++++++++ src/mesa/x86/gen_matypes.c | 12 +- 3 files changed, 1421 insertions(+), 768 deletions(-) create mode 100644 src/mesa/main/Makefile.BeOS-R5 (limited to 'src/mesa') diff --git a/src/mesa/drivers/beos/GLView.cpp b/src/mesa/drivers/beos/GLView.cpp index 56c1b7773b..b96b4e8289 100644 --- a/src/mesa/drivers/beos/GLView.cpp +++ b/src/mesa/drivers/beos/GLView.cpp @@ -1,4 +1,4 @@ -/* $Id: GLView.cpp,v 1.5 2000/11/17 21:01:26 brianp Exp $ */ +/* $Id: GLView.cpp,v 1.6 2002/09/19 16:19:45 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -27,6 +27,9 @@ /* * $Log: GLView.cpp,v $ + * Revision 1.6 2002/09/19 16:19:45 brianp + * Updated BeOS support (Philippe Houdoin) + * * Revision 1.5 2000/11/17 21:01:26 brianp * Minor header file changes to silence warnings. * Added _mesa_enable_sw_extensions(), called by software-only drivers @@ -70,14 +73,39 @@ * Initial revision */ - +#include "glheader.h" #include #include -#include -#include "../src/context.h" + +extern "C" { + +#include "context.h" +#include "colormac.h" +#include "depth.h" #include "extensions.h" +#include "macros.h" +#include "matrix.h" +#include "mem.h" +#include "mmath.h" +#include "mtypes.h" +#include "texformat.h" +#include "texstore.h" +#include "array_cache/acache.h" +#include "swrast/swrast.h" +#include "swrast_setup/swrast_setup.h" +#include "swrast/s_context.h" +#include "swrast/s_depth.h" +#include "swrast/s_lines.h" +#include "swrast/s_triangle.h" +#include "swrast/s_trispan.h" +#include "tnl/tnl.h" +#include "tnl/t_context.h" +#include "tnl/t_pipeline.h" + +} // extern "C" +#include // BeOS component ordering for B_RGBA32 bitmap format #define BE_RCOMP 2 @@ -85,6 +113,13 @@ #define BE_BCOMP 0 #define BE_ACOMP 3 +#define PACK_B_RGBA32(color) (color[BCOMP] | (color[GCOMP] << 8) | \ + (color[RCOMP] << 16) | (color[ACOMP] << 24)) + +#define PACK_B_RGB32(color) (color[BCOMP] | (color[GCOMP] << 8) | \ + (color[RCOMP] << 16) | 0xFF000000) + +#define FLIP(coord) (LIBGGI_MODE(ggi_ctx->ggi_visual)->visible.y-(coord) - 1) // // This object hangs off of the BGLView object. We have to use @@ -92,460 +127,846 @@ // can't add new members to it). Instead we just put all our data // in this class and use BGLVIew::m_gc to point to it. // -class AuxInfo +class MesaDriver { public: - AuxInfo(); - ~AuxInfo(); - void Init(BGLView *bglView, GLcontext *c, GLvisual *v, GLframebuffer *b); + MesaDriver(); + ~MesaDriver(); + void Init(BGLView * bglview, GLcontext * c, GLvisual * v, GLframebuffer * b); - void MakeCurrent(); - void SwapBuffers() const; - void CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const; + void LockGL(); + void UnlockGL(); + void SwapBuffers() const; + void CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const; + void Draw(BRect updateRect) const; private: - AuxInfo(const AuxInfo &rhs); // copy constructor illegal - AuxInfo &operator=(const AuxInfo &rhs); // assignment oper. illegal - - GLcontext *mContext; - GLvisual *mVisual; - GLframebuffer *mBuffer; - - BGLView *mBGLView; - BBitmap *mBitmap; - - GLubyte mClearColor[4]; // buffer clear color - GLuint mClearIndex; // buffer clear color index - GLint mBottom; // used for flipping Y coords - GLint mWidth, mHeight; // size of buffer - - // Mesa device driver functions - static void UpdateState(GLcontext *ctx); - static void ClearIndex(GLcontext *ctx, GLuint index); - static void ClearColor(GLcontext *ctx, GLubyte r, GLubyte g, - GLubyte b, GLubyte a); - static GLbitfield Clear(GLcontext *ctx, GLbitfield mask, + MesaDriver(const MesaDriver &rhs); // copy constructor illegal + MesaDriver &operator=(const MesaDriver &rhs); // assignment oper. illegal + + GLcontext * m_glcontext; + GLvisual * m_glvisual; + GLframebuffer * m_glframebuffer; + + BGLView * m_bglview; + BBitmap * m_bitmap; + + GLubyte m_clear_color[4]; // buffer clear color + GLuint m_clear_index; // buffer clear color index + GLint m_bottom; // used for flipping Y coords + GLuint m_width; + GLuint m_height; + + // Mesa Device Driver functions + static void UpdateState(GLcontext *ctx, GLuint new_state); + static void ClearIndex(GLcontext *ctx, GLuint index); + static void ClearColor(GLcontext *ctx, const GLchan color[4]); + static void Clear(GLcontext *ctx, GLbitfield mask, GLboolean all, GLint x, GLint y, GLint width, GLint height); - static void ClearFront(GLcontext *ctx, GLboolean all, GLint x, GLint y, + static void ClearFront(GLcontext *ctx, GLboolean all, GLint x, GLint y, GLint width, GLint height); - static void ClearBack(GLcontext *ctx, GLboolean all, GLint x, GLint y, + static void ClearBack(GLcontext *ctx, GLboolean all, GLint x, GLint y, GLint width, GLint height); - static void Index(GLcontext *ctx, GLuint index); - static void Color(GLcontext *ctx, GLubyte r, GLubyte g, + static void Index(GLcontext *ctx, GLuint index); + static void Color(GLcontext *ctx, GLubyte r, GLubyte g, GLubyte b, GLubyte a); - static GLboolean SetDrawBuffer(GLcontext *ctx, GLenum mode); - static void SetReadBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, + static void SetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, GLenum mode); - static void GetBufferSize(GLcontext *ctgx, GLuint *width, + static void GetBufferSize(GLframebuffer * framebuffer, GLuint *width, GLuint *height); - static const GLubyte *GetString(GLcontext *ctx, GLenum name); + static const GLubyte * GetString(GLcontext *ctx, GLenum name); // Front-buffer functions - static void WriteRGBASpanFront(const GLcontext *ctx, GLuint n, + static void WriteRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][4], const GLubyte mask[]); - static void WriteRGBSpanFront(const GLcontext *ctx, GLuint n, + static void WriteRGBSpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][3], const GLubyte mask[]); - static void WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, + static void WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLchan color[4], const GLubyte mask[]); - static void WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n, + static void WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], CONST GLubyte rgba[][4], const GLubyte mask[]); - static void WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, + static void WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLchan color[4], const GLubyte mask[]); - static void WriteCI32SpanFront(const GLcontext *ctx, GLuint n, + static void WriteCI32SpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLuint index[], const GLubyte mask[]); - static void WriteCI8SpanFront(const GLcontext *ctx, GLuint n, + static void WriteCI8SpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLubyte index[], const GLubyte mask[]); - static void WriteMonoCISpanFront(const GLcontext *ctx, GLuint n, + static void WriteMonoCISpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint colorIndex, const GLubyte mask[]); - static void WriteCI32PixelsFront(const GLcontext *ctx, + static void WriteCI32PixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLuint index[], const GLubyte mask[]); - static void WriteMonoCIPixelsFront(const GLcontext *ctx, GLuint n, + static void WriteMonoCIPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint colorIndex, const GLubyte mask[]); - static void ReadCI32SpanFront(const GLcontext *ctx, + static void ReadCI32SpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint index[]); - static void ReadRGBASpanFront(const GLcontext *ctx, GLuint n, + static void ReadRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLubyte rgba[][4]); - static void ReadCI32PixelsFront(const GLcontext *ctx, + static void ReadCI32PixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint indx[], const GLubyte mask[]); - static void ReadRGBAPixelsFront(const GLcontext *ctx, + static void ReadRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLubyte rgba[][4], const GLubyte mask[]); // Back buffer functions - static void WriteRGBASpanBack(const GLcontext *ctx, GLuint n, + static void WriteRGBASpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][4], const GLubyte mask[]); - static void WriteRGBSpanBack(const GLcontext *ctx, GLuint n, + static void WriteRGBSpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][3], const GLubyte mask[]); - static void WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, + static void WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLchan color[4], const GLubyte mask[]); - static void WriteRGBAPixelsBack(const GLcontext *ctx, GLuint n, + static void WriteRGBAPixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], CONST GLubyte rgba[][4], const GLubyte mask[]); - static void WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, + static void WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLchan color[4], const GLubyte mask[]); - static void WriteCI32SpanBack(const GLcontext *ctx, GLuint n, + static void WriteCI32SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLuint index[], const GLubyte mask[]); - static void WriteCI8SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, + static void WriteCI8SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLubyte index[], const GLubyte mask[]); - static void WriteMonoCISpanBack(const GLcontext *ctx, GLuint n, + static void WriteMonoCISpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint colorIndex, const GLubyte mask[]); - static void WriteCI32PixelsBack(const GLcontext *ctx, + static void WriteCI32PixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLuint index[], const GLubyte mask[]); - static void WriteMonoCIPixelsBack(const GLcontext *ctx, + static void WriteMonoCIPixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint colorIndex, const GLubyte mask[]); - static void ReadCI32SpanBack(const GLcontext *ctx, + static void ReadCI32SpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint index[]); - static void ReadRGBASpanBack(const GLcontext *ctx, GLuint n, + static void ReadRGBASpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, GLubyte rgba[][4]); - static void ReadCI32PixelsBack(const GLcontext *ctx, + static void ReadCI32PixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint indx[], const GLubyte mask[]); - static void ReadRGBAPixelsBack(const GLcontext *ctx, + static void ReadRGBAPixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLubyte rgba[][4], const GLubyte mask[]); }; +//------------------------------------------------------------------ +// Public interface methods +//------------------------------------------------------------------ -AuxInfo::AuxInfo() +// +// Input: rect - initial rectangle +// name - window name +// resizingMode - example: B_FOLLOW_NONE +// mode - usually 0 ? +// options - Bitwise-OR of BGL_* tokens +// +BGLView::BGLView(BRect rect, char *name, + ulong resizingMode, ulong mode, + ulong options) + :BView(rect, name, resizingMode, mode | B_WILL_DRAW | B_FRAME_EVENTS) // | B_FULL_UPDATE_ON_RESIZE) { - mContext = NULL; - mVisual = NULL; - mBuffer = NULL; - mBGLView = NULL; - mBitmap = NULL; - mClearColor[BE_RCOMP] = 0; - mClearColor[BE_GCOMP] = 0; - mClearColor[BE_BCOMP] = 0; - mClearColor[BE_ACOMP] = 0; - mClearIndex = 0; -} + const GLboolean rgbFlag = (options & BGL_RGB) == BGL_RGB; + const GLboolean alphaFlag = (options & BGL_ALPHA) == BGL_ALPHA; + const GLboolean dblFlag = (options & BGL_DOUBLE) == BGL_DOUBLE; + const GLboolean stereoFlag = false; + const GLint depth = (options & BGL_DEPTH) ? 16 : 0; + const GLint stencil = (options & BGL_STENCIL) ? 8 : 0; + const GLint accum = (options & BGL_ACCUM) ? 16 : 0; + const GLint index = (options & BGL_INDEX) ? 32 : 0; + const GLint red = (options & BGL_RGB) ? 8 : 0; + const GLint green = (options & BGL_RGB) ? 8 : 0; + const GLint blue = (options & BGL_RGB) ? 8 : 0; + const GLint alpha = (options & BGL_RGB) ? 8 : 0; + + if (!rgbFlag) { + fprintf(stderr, "Mesa Warning: color index mode not supported\n"); + } + // Allocate auxiliary data object + MesaDriver * md = new MesaDriver; -AuxInfo::~AuxInfo() -{ + // examine option flags and create gl_context struct + GLvisual * visual = _mesa_create_visual( rgbFlag, + dblFlag, + stereoFlag, + red, green, blue, alpha, + index, + depth, + stencil, + accum, accum, accum, accum, + 1 + ); + + // create core context + __GLimports imports; + _mesa_init_default_imports(&imports, md); + GLcontext * ctx = _mesa_create_context( visual, NULL, &imports); + + + // create core framebuffer + GLframebuffer * buffer = _mesa_create_framebuffer(visual, + depth > 0 ? GL_TRUE : GL_FALSE, + stencil > 0 ? GL_TRUE: GL_FALSE, + accum > 0 ? GL_TRUE : GL_FALSE, + alphaFlag + ); + + _mesa_enable_sw_extensions(ctx); + _mesa_enable_1_3_extensions(ctx); + + /* Initialize the software rasterizer and helper modules. + */ + + _swrast_CreateContext(ctx); + _ac_CreateContext(ctx); + _tnl_CreateContext(ctx); + _swsetup_CreateContext(ctx); + + _swsetup_Wakeup(ctx); + + md->Init(this, ctx, visual, buffer ); - _mesa_destroy_visual(mVisual); - _mesa_destroy_framebuffer(mBuffer); - _mesa_destroy_context(mContext); + // Hook aux data into BGLView object + m_gc = md; } -void AuxInfo::Init(BGLView *bglView, GLcontext *c, GLvisual *v, GLframebuffer *b) +BGLView::~BGLView() { - mBGLView = bglView; - mContext = c; - mVisual = v; - mBuffer = b; + printf("BGLView destructor\n"); + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + delete md; } - -void AuxInfo::MakeCurrent() +void BGLView::LockGL() { - UpdateState(mContext); - _mesa_make_current(mContext, mBuffer); + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->LockGL(); } +void BGLView::UnlockGL() +{ + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->UnlockGL(); +} -void AuxInfo::SwapBuffers() const +void BGLView::SwapBuffers() { - if (mBitmap) { - mBGLView->DrawBitmap(mBitmap, BPoint(0, 0)); - } + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->SwapBuffers(); } -void AuxInfo::CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const +void BGLView::CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height) { - if (mBitmap) { - // Source bitmap and view's bitmap are same size. - // Source and dest rectangle are the same. - // Note (x,y) = (0,0) is the lower-left corner, have to flip Y - BRect srcAndDest; - srcAndDest.left = x; - srcAndDest.right = x + width - 1; - srcAndDest.bottom = mBottom - y; - srcAndDest.top = srcAndDest.bottom - height + 1; - mBGLView->DrawBitmap(mBitmap, srcAndDest, srcAndDest); - } + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->CopySubBuffer(x, y, width, height); } -void AuxInfo::UpdateState( GLcontext *ctx ) +BView * BGLView::EmbeddedView() { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; + // XXX to do + return NULL; +} - assert(aux->mContext == ctx ); +status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest) +{ + // XXX to do + printf("BGLView::CopyPixelsOut() not implemented yet!\n"); + return B_UNSUPPORTED; +} - ctx->Driver.UpdateState = AuxInfo::UpdateState; - ctx->Driver.SetDrawBuffer = AuxInfo::SetDrawBuffer; - ctx->Driver.SetReadBuffer = AuxInfo::SetReadBuffer; - ctx->Driver.ClearIndex = AuxInfo::ClearIndex; - ctx->Driver.ClearColor = AuxInfo::ClearColor; - ctx->Driver.GetBufferSize = AuxInfo::GetBufferSize; - ctx->Driver.GetString = AuxInfo::GetString; - ctx->Driver.Clear = AuxInfo::Clear; - if (ctx->Color.DrawBuffer == GL_FRONT) { - /* read/write front buffer */ - ctx->Driver.WriteRGBASpan = AuxInfo::WriteRGBASpanFront; - ctx->Driver.WriteRGBSpan = AuxInfo::WriteRGBSpanFront; - ctx->Driver.WriteRGBAPixels = AuxInfo::WriteRGBAPixelsFront; - ctx->Driver.WriteMonoRGBASpan = AuxInfo::WriteMonoRGBASpanFront; - ctx->Driver.WriteMonoRGBAPixels = AuxInfo::WriteMonoRGBAPixelsFront; - ctx->Driver.WriteCI32Span = AuxInfo::WriteCI32SpanFront; - ctx->Driver.WriteCI8Span = AuxInfo::WriteCI8SpanFront; - ctx->Driver.WriteMonoCISpan = AuxInfo::WriteMonoCISpanFront; - ctx->Driver.WriteCI32Pixels = AuxInfo::WriteCI32PixelsFront; - ctx->Driver.WriteMonoCIPixels = AuxInfo::WriteMonoCIPixelsFront; - ctx->Driver.ReadRGBASpan = AuxInfo::ReadRGBASpanFront; - ctx->Driver.ReadRGBAPixels = AuxInfo::ReadRGBAPixelsFront; - ctx->Driver.ReadCI32Span = AuxInfo::ReadCI32SpanFront; - ctx->Driver.ReadCI32Pixels = AuxInfo::ReadCI32PixelsFront; - } - else { - /* read/write back buffer */ - ctx->Driver.WriteRGBASpan = AuxInfo::WriteRGBASpanBack; - ctx->Driver.WriteRGBSpan = AuxInfo::WriteRGBSpanBack; - ctx->Driver.WriteRGBAPixels = AuxInfo::WriteRGBAPixelsBack; - ctx->Driver.WriteMonoRGBASpan = AuxInfo::WriteMonoRGBASpanBack; - ctx->Driver.WriteMonoRGBAPixels = AuxInfo::WriteMonoRGBAPixelsBack; - ctx->Driver.WriteCI32Span = AuxInfo::WriteCI32SpanBack; - ctx->Driver.WriteCI8Span = AuxInfo::WriteCI8SpanBack; - ctx->Driver.WriteMonoCISpan = AuxInfo::WriteMonoCISpanBack; - ctx->Driver.WriteCI32Pixels = AuxInfo::WriteCI32PixelsBack; - ctx->Driver.WriteMonoCIPixels = AuxInfo::WriteMonoCIPixelsBack; - ctx->Driver.ReadRGBASpan = AuxInfo::ReadRGBASpanBack; - ctx->Driver.ReadRGBAPixels = AuxInfo::ReadRGBAPixelsBack; - ctx->Driver.ReadCI32Span = AuxInfo::ReadCI32SpanBack; - ctx->Driver.ReadCI32Pixels = AuxInfo::ReadCI32PixelsBack; - } +status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest) +{ + // XXX to do + printf("BGLView::CopyPixelsIn() not implemented yet!\n"); + return B_UNSUPPORTED; } +void BGLView::ErrorCallback(unsigned long errorCode) // GLenum errorCode) +{ + // XXX to do + printf("BGLView::ErrorCallback() not implemented yet!\n"); + return; +} -void AuxInfo::ClearIndex(GLcontext *ctx, GLuint index) +void BGLView::Draw(BRect updateRect) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - aux->mClearIndex = index; + // printf("BGLView::Draw()\n"); + MesaDriver * md = (MesaDriver *) m_gc; + assert(md); + md->Draw(updateRect); } +void BGLView::AttachedToWindow() +{ + BView::AttachedToWindow(); + + // don't paint window background white when resized + SetViewColor(B_TRANSPARENT_32_BIT); +} -void AuxInfo::ClearColor(GLcontext *ctx, GLubyte r, GLubyte g, - GLubyte b, GLubyte a) +void BGLView::AllAttached() { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - aux->mClearColor[BE_RCOMP] = r; - aux->mClearColor[BE_GCOMP] = g; - aux->mClearColor[BE_BCOMP] = b; - aux->mClearColor[BE_ACOMP] = a; - assert(aux->mBGLView); + BView::AllAttached(); +// printf("BGLView AllAttached\n"); } +void BGLView::DetachedFromWindow() +{ + BView::DetachedFromWindow(); +} -GLbitfield AuxInfo::Clear(GLcontext *ctx, GLbitfield mask, - GLboolean all, GLint x, GLint y, - GLint width, GLint height) +void BGLView::AllDetached() { - if (mask & DD_FRONT_LEFT_BIT) - ClearFront(ctx, all, x, y, width, height); - if (mask & DD_BACK_LEFT_BIT) - ClearBack(ctx, all, x, y, width, height); - return mask & ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); + BView::AllDetached(); +// printf("BGLView AllDetached"); } +void BGLView::FrameResized(float width, float height) +{ + return BView::FrameResized(width, height); +} -void AuxInfo::ClearFront(GLcontext *ctx, - GLboolean all, GLint x, GLint y, - GLint width, GLint height) +status_t BGLView::Perform(perform_code d, void *arg) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; - assert(bglview); + return BView::Perform(d, arg); +} - bglview->SetHighColor(aux->mClearColor[BE_RCOMP], - aux->mClearColor[BE_GCOMP], - aux->mClearColor[BE_BCOMP], - aux->mClearColor[BE_ACOMP]); - bglview->SetLowColor(aux->mClearColor[BE_RCOMP], - aux->mClearColor[BE_GCOMP], - aux->mClearColor[BE_BCOMP], - aux->mClearColor[BE_ACOMP]); - if (all) { - BRect b = bglview->Bounds(); - bglview->FillRect(b); - } - else { - // XXX untested - BRect b; - b.left = x; - b.right = x + width; - b.bottom = aux->mHeight - y - 1; - b.top = b.bottom - height; - bglview->FillRect(b); - } - // restore drawing color -#if 0 - bglview->SetHighColor(aux->mColor[BE_RCOMP], - aux->mColor[BE_GCOMP], - aux->mColor[BE_BCOMP], - aux->mColor[BE_ACOMP]); - bglview->SetLowColor(aux->mColor[BE_RCOMP], - aux->mColor[BE_GCOMP], - aux->mColor[BE_BCOMP], - aux->mColor[BE_ACOMP]); -#endif +status_t BGLView::Archive(BMessage *data, bool deep) const +{ + return BView::Archive(data, deep); } - -void AuxInfo::ClearBack(GLcontext *ctx, - GLboolean all, GLint x, GLint y, - GLint width, GLint height) +void BGLView::MessageReceived(BMessage *msg) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; - assert(bglview); - BBitmap *bitmap = aux->mBitmap; - assert(bitmap); - GLuint *start = (GLuint *) bitmap->Bits(); - const GLuint *clearPixelPtr = (const GLuint *) aux->mClearColor; - const GLuint clearPixel = *clearPixelPtr; + BView::MessageReceived(msg); +} - if (all) { - const int numPixels = aux->mWidth * aux->mHeight; - if (clearPixel == 0) { - memset(start, 0, numPixels * 4); - } - else { - for (int i = 0; i < numPixels; i++) { - start[i] = clearPixel; - } - } - } - else { - // XXX untested - start += y * aux->mWidth + x; - for (int i = 0; i < height; i++) { - for (int j = 0; j < width; j++) { - start[j] = clearPixel; - } - start += aux->mWidth; - } - } +void BGLView::SetResizingMode(uint32 mode) +{ + BView::SetResizingMode(mode); } +void BGLView::Show() +{ +// printf("BGLView Show\n"); + BView::Show(); +} -GLboolean AuxInfo::SetDrawBuffer(GLcontext *ctx, GLenum buffer) +void BGLView::Hide() { - if (buffer == GL_FRONT_LEFT) - return GL_TRUE; - else if (buffer == GL_BACK_LEFT) - return GL_TRUE; - else - return GL_FALSE; +// printf("BGLView Hide\n"); + BView::Hide(); } -void AuxInfo::SetReadBuffer(GLcontext *ctx, GLframebuffer *colorBuffer, - GLenum buffer) +BHandler *BGLView::ResolveSpecifier(BMessage *msg, int32 index, + BMessage *specifier, int32 form, + const char *property) { - /* XXX to do */ + return BView::ResolveSpecifier(msg, index, specifier, form, property); } -void AuxInfo::GetBufferSize(GLcontext *ctx, GLuint *width, - GLuint *height) +status_t BGLView::GetSupportedSuites(BMessage *data) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; - assert(bglview); - BRect b = bglview->Bounds(); - *width = (GLuint) (b.right - b.left + 1); - *height = (GLuint) (b.bottom - b.top + 1); - aux->mBottom = (GLint) b.bottom; + return BView::GetSupportedSuites(data); +} - if (ctx->Visual->DBflag) { - if (*width != aux->mWidth || *height != aux->mHeight) { - // allocate new size of back buffer bitmap - if (aux->mBitmap) - delete aux->mBitmap; - BRect rect(0.0, 0.0, *width - 1, *height - 1); - aux->mBitmap = new BBitmap(rect, B_RGBA32); - } - } - else - { - aux->mBitmap = NULL; - } +void BGLView::DirectConnected( direct_buffer_info *info ) +{ + // XXX to do +} - aux->mWidth = *width; - aux->mHeight = *height; +void BGLView::EnableDirectMode( bool enabled ) +{ + // XXX to do } -const GLubyte *AuxInfo::GetString(GLcontext *ctx, GLenum name) + +//---- private methods ---------- + +void BGLView::_ReservedGLView1() {} +void BGLView::_ReservedGLView2() {} +void BGLView::_ReservedGLView3() {} +void BGLView::_ReservedGLView4() {} +void BGLView::_ReservedGLView5() {} +void BGLView::_ReservedGLView6() {} +void BGLView::_ReservedGLView7() {} +void BGLView::_ReservedGLView8() {} + +#if 0 +BGLView::BGLView(const BGLView &v) + : BView(v) { - switch (name) { - case GL_RENDERER: - return (const GLubyte *) "Mesa BeOS"; - default: - // Let core library handle all other cases - return NULL; - } + // XXX not sure how this should work + printf("Warning BGLView::copy constructor not implemented\n"); } +#endif -// Plot a pixel. (0,0) is upper-left corner -// This is only used when drawing to the front buffer. -static void Plot(BGLView *bglview, int x, int y) +BGLView &BGLView::operator=(const BGLView &v) { - // XXX There's got to be a better way! - BPoint p(x, y), q(x+1, y); - bglview->StrokeLine(p, q); + printf("Warning BGLView::operator= not implemented\n"); + return *this; } +void BGLView::dither_front() +{ + // no-op +} -void AuxInfo::WriteRGBASpanFront(const GLcontext *ctx, GLuint n, - GLint x, GLint y, - CONST GLubyte rgba[][4], - const GLubyte mask[]) +bool BGLView::confirm_dither() { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; - assert(bglview); - int flippedY = aux->mBottom - y; - if (mask) { + // no-op + return false; +} + +void BGLView::draw(BRect r) +{ + // XXX no-op ??? +} + +/* Direct Window stuff */ +void BGLView::drawScanline( int x1, int x2, int y, void *data ) +{ + // no-op +} + +void BGLView::scanlineHandler(struct rasStateRec *state, + GLint x1, GLint x2) +{ + // no-op +} + +void BGLView::lock_draw() +{ + // no-op +} + +void BGLView::unlock_draw() +{ + // no-op +} + +bool BGLView::validateView() +{ + // no-op + return true; +} + +// #pragma mark - + +MesaDriver::MesaDriver() +{ + m_glcontext = NULL; + m_glvisual = NULL; + m_glframebuffer = NULL; + m_bglview = NULL; + m_bitmap = NULL; + + m_clear_color[BE_RCOMP] = 0; + m_clear_color[BE_GCOMP] = 0; + m_clear_color[BE_BCOMP] = 0; + m_clear_color[BE_ACOMP] = 0; + + m_clear_index = 0; +} + + +MesaDriver::~MesaDriver() +{ + _mesa_destroy_visual(m_glvisual); + _mesa_destroy_framebuffer(m_glframebuffer); + _mesa_destroy_context(m_glcontext); + +} + + +void MesaDriver::Init(BGLView * bglview, GLcontext * ctx, GLvisual * visual, GLframebuffer * framebuffer) +{ + m_bglview = bglview; + m_glcontext = ctx; + m_glvisual = visual; + m_glframebuffer = framebuffer; + + MesaDriver * md = (MesaDriver *) ctx->DriverCtx; + struct swrast_device_driver * swdd = _swrast_GetDeviceDriverReference( ctx ); + TNLcontext * tnl = TNL_CONTEXT(ctx); + + assert(md->m_glcontext == ctx ); + + ctx->Driver.GetString = MesaDriver::GetString; + ctx->Driver.UpdateState = MesaDriver::UpdateState; + ctx->Driver.GetBufferSize = MesaDriver::GetBufferSize; + ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; + + ctx->Driver.Accum = _swrast_Accum; + ctx->Driver.Bitmap = _swrast_Bitmap; + ctx->Driver.ClearIndex = MesaDriver::ClearIndex; + ctx->Driver.ClearColor = MesaDriver::ClearColor; + ctx->Driver.Clear = MesaDriver::Clear; + ctx->Driver.CopyPixels = _swrast_CopyPixels; + ctx->Driver.DrawPixels = _swrast_DrawPixels; + ctx->Driver.ReadPixels = _swrast_ReadPixels; + + ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format; + ctx->Driver.TexImage1D = _mesa_store_teximage1d; + ctx->Driver.TexImage2D = _mesa_store_teximage2d; + ctx->Driver.TexImage3D = _mesa_store_teximage3d; + ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d; + ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d; + ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d; + ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage; + + ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d; + ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d; + ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d; + ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d; + ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d; + ctx->Driver.CopyColorTable = _swrast_CopyColorTable; + ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable; + ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; + ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; + + ctx->Driver.BaseCompressedTexFormat = _mesa_base_compressed_texformat; + ctx->Driver.CompressedTextureSize = _mesa_compressed_texture_size; + ctx->Driver.GetCompressedTexImage = _mesa_get_compressed_teximage; + + swdd->SetBuffer = MesaDriver::SetBuffer; + + tnl->Driver.RunPipeline = _tnl_run_pipeline; + + _swsetup_Wakeup(ctx); +} + + +void MesaDriver::LockGL() +{ + m_bglview->LockLooper(); + + UpdateState(m_glcontext, 0); + _mesa_make_current(m_glcontext, m_glframebuffer); +} + + +void MesaDriver::UnlockGL() +{ + m_bglview->UnlockLooper(); + // Could call _mesa_make_current(NULL, NULL) but it would just + // hinder performance +} + + +void MesaDriver::SwapBuffers() const +{ + // _mesa_swap_buffers(); + + if (m_bitmap) { + m_bglview->LockLooper(); + m_bglview->DrawBitmap(m_bitmap, BPoint(0, 0)); + m_bglview->UnlockLooper(); + }; +} + + +void MesaDriver::CopySubBuffer(GLint x, GLint y, GLuint width, GLuint height) const +{ + if (m_bitmap) { + // Source bitmap and view's bitmap are same size. + // Source and dest rectangle are the same. + // Note (x,y) = (0,0) is the lower-left corner, have to flip Y + BRect srcAndDest; + srcAndDest.left = x; + srcAndDest.right = x + width - 1; + srcAndDest.bottom = m_bottom - y; + srcAndDest.top = srcAndDest.bottom - height + 1; + m_bglview->DrawBitmap(m_bitmap, srcAndDest, srcAndDest); + } +} + + +void MesaDriver::Draw(BRect updateRect) const +{ + if (m_bitmap) + m_bglview->DrawBitmap(m_bitmap, updateRect, updateRect); +} + + +void MesaDriver::UpdateState( GLcontext *ctx, GLuint new_state ) +{ + struct swrast_device_driver * swdd = _swrast_GetDeviceDriverReference( ctx ); + + _swrast_InvalidateState( ctx, new_state ); + _swsetup_InvalidateState( ctx, new_state ); + _ac_InvalidateState( ctx, new_state ); + _tnl_InvalidateState( ctx, new_state ); + + if (ctx->Color.DrawBuffer == GL_FRONT) { + /* read/write front buffer */ + swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanFront; + swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanFront; + swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsFront; + swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanFront; + swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsFront; + swdd->WriteCI32Span = MesaDriver::WriteCI32SpanFront; + swdd->WriteCI8Span = MesaDriver::WriteCI8SpanFront; + swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanFront; + swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsFront; + swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsFront; + swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanFront; + swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsFront; + swdd->ReadCI32Span = MesaDriver::ReadCI32SpanFront; + swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsFront; + } + else { + /* read/write back buffer */ + swdd->WriteRGBASpan = MesaDriver::WriteRGBASpanBack; + swdd->WriteRGBSpan = MesaDriver::WriteRGBSpanBack; + swdd->WriteRGBAPixels = MesaDriver::WriteRGBAPixelsBack; + swdd->WriteMonoRGBASpan = MesaDriver::WriteMonoRGBASpanBack; + swdd->WriteMonoRGBAPixels = MesaDriver::WriteMonoRGBAPixelsBack; + swdd->WriteCI32Span = MesaDriver::WriteCI32SpanBack; + swdd->WriteCI8Span = MesaDriver::WriteCI8SpanBack; + swdd->WriteMonoCISpan = MesaDriver::WriteMonoCISpanBack; + swdd->WriteCI32Pixels = MesaDriver::WriteCI32PixelsBack; + swdd->WriteMonoCIPixels = MesaDriver::WriteMonoCIPixelsBack; + swdd->ReadRGBASpan = MesaDriver::ReadRGBASpanBack; + swdd->ReadRGBAPixels = MesaDriver::ReadRGBAPixelsBack; + swdd->ReadCI32Span = MesaDriver::ReadCI32SpanBack; + swdd->ReadCI32Pixels = MesaDriver::ReadCI32PixelsBack; + } +} + + +void MesaDriver::ClearIndex(GLcontext *ctx, GLuint index) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + md->m_clear_index = index; +} + + +void MesaDriver::ClearColor(GLcontext *ctx, const GLchan color[4]) + // GLubyte r, GLubyte g, + // GLubyte b, GLubyte a) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + md->m_clear_color[BE_RCOMP] = color[0]; + md->m_clear_color[BE_GCOMP] = color[1]; + md->m_clear_color[BE_BCOMP] = color[2]; + md->m_clear_color[BE_ACOMP] = color[3]; + assert(md->m_bglview); +} + + +void MesaDriver::Clear(GLcontext *ctx, GLbitfield mask, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + if (mask & DD_FRONT_LEFT_BIT) + ClearFront(ctx, all, x, y, width, height); + if (mask & DD_BACK_LEFT_BIT) + ClearBack(ctx, all, x, y, width, height); + + mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT); + if (mask) + _swrast_Clear( ctx, mask, all, x, y, width, height ); + + return; +} + + +void MesaDriver::ClearFront(GLcontext *ctx, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + + bglview->SetHighColor(md->m_clear_color[BE_RCOMP], + md->m_clear_color[BE_GCOMP], + md->m_clear_color[BE_BCOMP], + md->m_clear_color[BE_ACOMP]); + bglview->SetLowColor(md->m_clear_color[BE_RCOMP], + md->m_clear_color[BE_GCOMP], + md->m_clear_color[BE_BCOMP], + md->m_clear_color[BE_ACOMP]); + if (all) { + BRect b = bglview->Bounds(); + bglview->FillRect(b); + } + else { + // XXX untested + BRect b; + b.left = x; + b.right = x + width; + b.bottom = md->m_height - y - 1; + b.top = b.bottom - height; + bglview->FillRect(b); + } + + // restore drawing color +#if 0 + bglview->SetHighColor(md->mColor[BE_RCOMP], + md->mColor[BE_GCOMP], + md->mColor[BE_BCOMP], + md->mColor[BE_ACOMP]); + bglview->SetLowColor(md->mColor[BE_RCOMP], + md->mColor[BE_GCOMP], + md->mColor[BE_BCOMP], + md->mColor[BE_ACOMP]); +#endif +} + + +void MesaDriver::ClearBack(GLcontext *ctx, + GLboolean all, GLint x, GLint y, + GLint width, GLint height) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + BBitmap *bitmap = md->m_bitmap; + assert(bitmap); + GLuint *start = (GLuint *) bitmap->Bits(); + const GLuint *clearPixelPtr = (const GLuint *) md->m_clear_color; + const GLuint clearPixel = *clearPixelPtr; + + if (all) { + const int numPixels = md->m_width * md->m_height; + if (clearPixel == 0) { + memset(start, 0, numPixels * 4); + } + else { + for (int i = 0; i < numPixels; i++) { + start[i] = clearPixel; + } + } + } + else { + // XXX untested + start += y * md->m_width + x; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + start[j] = clearPixel; + } + start += md->m_width; + } + } +} + + +void MesaDriver::SetBuffer(GLcontext *ctx, GLframebuffer *buffer, + GLenum mode) +{ + /* TODO */ + (void) ctx; + (void) buffer; + (void) mode; +} + +void MesaDriver::GetBufferSize(GLframebuffer * framebuffer, GLuint *width, + GLuint *height) +{ + GET_CURRENT_CONTEXT(ctx); + if (!ctx) + return; + + MesaDriver * md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + + BRect b = bglview->Bounds(); + *width = (GLuint) b.IntegerWidth() + 1; // (b.right - b.left + 1); + *height = (GLuint) b.IntegerHeight() + 1; // (b.bottom - b.top + 1); + md->m_bottom = (GLint) b.bottom; + + if (ctx->Visual.doubleBufferMode) { + if (*width != md->m_width || *height != md->m_height) { + // allocate new size of back buffer bitmap + if (md->m_bitmap) + delete md->m_bitmap; + BRect rect(0.0, 0.0, *width - 1, *height - 1); + md->m_bitmap = new BBitmap(rect, B_RGBA32); + } + } + else + { + md->m_bitmap = NULL; + } + + md->m_width = *width; + md->m_height = *height; +} + + +const GLubyte *MesaDriver::GetString(GLcontext *ctx, GLenum name) +{ + switch (name) { + case GL_RENDERER: + return (const GLubyte *) "Mesa BGLView (software)"; + default: + // Let core library handle all other cases + return NULL; + } +} + + +// Plot a pixel. (0,0) is upper-left corner +// This is only used when drawing to the front buffer. +static void Plot(BGLView *bglview, int x, int y) +{ + // XXX There's got to be a better way! + BPoint p(x, y), q(x+1, y); + bglview->StrokeLine(p, q); +} + + +void MesaDriver::WriteRGBASpanFront(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgba[][4], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; + assert(bglview); + int flippedY = md->m_bottom - y; + if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2], rgba[i][3]); @@ -561,15 +982,15 @@ void AuxInfo::WriteRGBASpanFront(const GLcontext *ctx, GLuint n, } } -void AuxInfo::WriteRGBSpanFront(const GLcontext *ctx, GLuint n, +void MesaDriver::WriteRGBSpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][3], const GLubyte mask[]) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; assert(bglview); - int flippedY = aux->mBottom - y; + int flippedY = md->m_bottom - y; if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { @@ -586,15 +1007,15 @@ void AuxInfo::WriteRGBSpanFront(const GLcontext *ctx, GLuint n, } } -void AuxInfo::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLchan color[4], const GLubyte mask[]) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; assert(bglview); - int flippedY = aux->mBottom - y; + int flippedY = md->m_bottom - y; bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); if (mask) { for (GLuint i = 0; i < n; i++) { @@ -610,69 +1031,69 @@ void AuxInfo::WriteMonoRGBASpanFront(const GLcontext *ctx, GLuint n, } } -void AuxInfo::WriteRGBAPixelsFront(const GLcontext *ctx, +void MesaDriver::WriteRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], CONST GLubyte rgba[][4], const GLubyte mask[] ) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; assert(bglview); if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); - Plot(bglview, x[i], aux->mBottom - y[i]); + Plot(bglview, x[i], md->m_bottom - y[i]); } } } else { for (GLuint i = 0; i < n; i++) { bglview->SetHighColor(rgba[i][0], rgba[i][1], rgba[i][2]); - Plot(bglview, x[i], aux->mBottom - y[i]); + Plot(bglview, x[i], md->m_bottom - y[i]); } } } -void AuxInfo::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoRGBAPixelsFront(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLchan color[4], const GLubyte mask[]) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BGLView *bglview = aux->mBGLView; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BGLView *bglview = md->m_bglview; assert(bglview); // plot points using current color bglview->SetHighColor(color[RCOMP], color[GCOMP], color[BCOMP]); if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { - Plot(bglview, x[i], aux->mBottom - y[i]); + Plot(bglview, x[i], md->m_bottom - y[i]); } } } else { for (GLuint i = 0; i < n; i++) { - Plot(bglview, x[i], aux->mBottom - y[i]); + Plot(bglview, x[i], md->m_bottom - y[i]); } } } -void AuxInfo::WriteCI32SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, +void MesaDriver::WriteCI32SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLuint index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteCI8SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, +void MesaDriver::WriteCI8SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLubyte index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint colorIndex, const GLubyte mask[] ) { @@ -680,14 +1101,14 @@ void AuxInfo::WriteMonoCISpanFront( const GLcontext *ctx, GLuint n, } -void AuxInfo::WriteCI32PixelsFront( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteCI32PixelsFront( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLuint index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint colorIndex, const GLubyte mask[] ) { @@ -695,215 +1116,267 @@ void AuxInfo::WriteMonoCIPixelsFront( const GLcontext *ctx, GLuint n, } -void AuxInfo::ReadCI32SpanFront( const GLcontext *ctx, +void MesaDriver::ReadCI32SpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint index[] ) { - // XXX to do + printf("ReadCI32SpanFront() not implemented yet!\n"); + // XXX to do } -void AuxInfo::ReadRGBASpanFront( const GLcontext *ctx, GLuint n, +void MesaDriver::ReadRGBASpanFront( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLubyte rgba[][4] ) { + printf("ReadRGBASpanFront() not implemented yet!\n"); // XXX to do } -void AuxInfo::ReadCI32PixelsFront( const GLcontext *ctx, +void MesaDriver::ReadCI32PixelsFront( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint indx[], const GLubyte mask[] ) { + printf("ReadCI32PixelsFront() not implemented yet!\n"); // XXX to do } -void AuxInfo::ReadRGBAPixelsFront( const GLcontext *ctx, +void MesaDriver::ReadRGBAPixelsFront( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLubyte rgba[][4], const GLubyte mask[] ) { + printf("ReadRGBAPixelsFront() not implemented yet!\n"); // XXX to do } -void AuxInfo::WriteRGBASpanBack(const GLcontext *ctx, GLuint n, +void MesaDriver::WriteRGBASpanBack(const GLcontext *ctx, GLuint n, GLint x, GLint y, CONST GLubyte rgba[][4], const GLubyte mask[]) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BBitmap *bitmap = aux->mBitmap; - assert(bitmap); - int row = aux->mBottom - y; - GLubyte *pixel = (GLubyte *) bitmap->Bits() + (row * aux->mWidth + x) * 4; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBASpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + + if (mask) { + while(n--) { + if (*mask++) + *pixel = PACK_B_RGBA32(rgba[0]); + pixel++; + rgba++; + }; + } else { + while(n--) { + *pixel++ = PACK_B_RGBA32(rgba[0]); + rgba++; + }; + }; + } + + +void MesaDriver::WriteRGBSpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + CONST GLubyte rgb[][3], + const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBSpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + + if (mask) { + while(n--) { + if (*mask++) + *pixel = PACK_B_RGB32(rgb[0]); + pixel++; + rgb++; + }; + } else { + while(n--) { + *pixel++ = PACK_B_RGB32(rgb[0]); + rgb++; + }; + }; +} + + + + +void MesaDriver::WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, + GLint x, GLint y, + const GLchan color[4], const GLubyte mask[]) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteMonoRGBASpanBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + int row = md->m_bottom - y; + uint8 * ptr = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + x * 4; + uint32 * pixel = (uint32 *) ptr; + uint32 pixel_color = PACK_B_RGBA32(color); + + if (mask) { + while(n--) { + if (*mask++) + *pixel = pixel_color; + pixel++; + }; + } else { + while(n--) { + *pixel++ = pixel_color; + }; + }; +} + + +void MesaDriver::WriteRGBAPixelsBack(const GLcontext *ctx, + GLuint n, const GLint x[], const GLint y[], + CONST GLubyte rgba[][4], + const GLubyte mask[] ) +{ + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteRGBAPixelsBack() called.\n"); + already_called = true; + } + + assert(bitmap); +#if 0 + while(n--) { + if (*mask++) { + int row = md->m_bottom - *y; + uint8 * pixel = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + *x * 4; + *((uint32 *) pixel) = PACK_B_RGBA32(rgba[0]); + }; + x++; + y++; + rgba++; + }; +#else if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; pixel[BE_RCOMP] = rgba[i][RCOMP]; pixel[BE_GCOMP] = rgba[i][GCOMP]; pixel[BE_BCOMP] = rgba[i][BCOMP]; pixel[BE_ACOMP] = rgba[i][ACOMP]; } - pixel += 4; } } else { for (GLuint i = 0; i < n; i++) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; pixel[BE_RCOMP] = rgba[i][RCOMP]; pixel[BE_GCOMP] = rgba[i][GCOMP]; pixel[BE_BCOMP] = rgba[i][BCOMP]; pixel[BE_ACOMP] = rgba[i][ACOMP]; - pixel += 4; } } +#endif } -void AuxInfo::WriteRGBSpanBack(const GLcontext *ctx, GLuint n, - GLint x, GLint y, - CONST GLubyte rgb[][3], - const GLubyte mask[]) -{ - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BBitmap *bitmap = aux->mBitmap; - assert(bitmap); - int row = aux->mBottom - y; - GLubyte *pixel = (GLubyte *) bitmap->Bits() + (row * aux->mWidth + x) * 4; - if (mask) { - for (GLuint i = 0; i < n; i++) { - if (mask[i]) { - pixel[BE_RCOMP] = rgb[i][RCOMP]; - pixel[BE_GCOMP] = rgb[i][GCOMP]; - pixel[BE_BCOMP] = rgb[i][BCOMP]; - pixel[BE_ACOMP] = 255; - } - pixel += 4; - } - } - else { - for (GLuint i = 0; i < n; i++) { - pixel[BE_RCOMP] = rgb[i][RCOMP]; - pixel[BE_GCOMP] = rgb[i][GCOMP]; - pixel[BE_BCOMP] = rgb[i][BCOMP]; - pixel[BE_ACOMP] = 255; - pixel += 4; - } - } -} - - -void AuxInfo::WriteMonoRGBASpanBack(const GLcontext *ctx, GLuint n, - GLint x, GLint y, - const GLchan color[4], const GLubyte mask[]) -{ - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BBitmap *bitmap = aux->mBitmap; - assert(bitmap); - int row = aux->mBottom - y; - GLuint *pixelPtr = (GLuint *) bitmap->Bits() + row * aux->mWidth + x; - GLuint pixel; - GLubyte *mColor= (GLubyte *) &pixel; - mColor[BE_RCOMP] = color[RCOMP]; - mColor[BE_GCOMP] = color[GCOMP]; - mColor[BE_BCOMP] = color[BCOMP]; - mColor[BE_ACOMP] = color[ACOMP]; - if (mask) { - for (GLuint i = 0; i < n; i++) { - if (mask[i]) - *pixelPtr = pixel; - pixelPtr++; - } - } - else { - for (GLuint i = 0; i < n; i++) { - *pixelPtr++ = pixel; - } - } -} - - -void AuxInfo::WriteRGBAPixelsBack(const GLcontext *ctx, - GLuint n, const GLint x[], const GLint y[], - CONST GLubyte rgba[][4], - const GLubyte mask[] ) -{ - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BBitmap *bitmap = aux->mBitmap; - assert(bitmap); - if (mask) { - for (GLuint i = 0; i < n; i++) { - if (mask[i]) { - GLubyte *pixel = (GLubyte *) bitmap->Bits() - + (aux->mBottom - y[i]) * bitmap->BytesPerRow() + x[i] * 4; - pixel[BE_RCOMP] = rgba[i][RCOMP]; - pixel[BE_GCOMP] = rgba[i][GCOMP]; - pixel[BE_BCOMP] = rgba[i][BCOMP]; - pixel[BE_ACOMP] = rgba[i][ACOMP]; - } - } - } - else { - for (GLuint i = 0; i < n; i++) { - GLubyte *pixel = (GLubyte *) bitmap->Bits() - + (aux->mBottom - y[i]) * bitmap->BytesPerRow() + x[i] * 4; - pixel[BE_RCOMP] = rgba[i][RCOMP]; - pixel[BE_GCOMP] = rgba[i][GCOMP]; - pixel[BE_BCOMP] = rgba[i][BCOMP]; - pixel[BE_ACOMP] = rgba[i][ACOMP]; - } - } -} - - -void AuxInfo::WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoRGBAPixelsBack(const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLchan color[4], const GLubyte mask[]) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - BBitmap *bitmap = aux->mBitmap; - GLuint pixel; - GLubyte *mColor= (GLubyte *) &pixel; - mColor[BE_RCOMP] = color[RCOMP]; - mColor[BE_GCOMP] = color[GCOMP]; - mColor[BE_BCOMP] = color[BCOMP]; - mColor[BE_ACOMP] = color[ACOMP]; - assert(bitmap); + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + BBitmap *bitmap = md->m_bitmap; + + static bool already_called = false; + if (! already_called) { + printf("WriteMonoRGBAPixelsBack() called.\n"); + already_called = true; + } + + assert(bitmap); + + uint32 pixel_color = PACK_B_RGBA32(color); +#if 0 + while(n--) { + if (*mask++) { + int row = md->m_bottom - *y; + uint8 * pixel = (uint8 *) bitmap->Bits() + (row * bitmap->BytesPerRow()) + *x * 4; + + *((uint32 *) pixel) = pixel_color; + }; + x++; + y++; + }; +#else if (mask) { for (GLuint i = 0; i < n; i++) { if (mask[i]) { - GLuint *pixelPtr = (GLuint *) bitmap->Bits() - + (aux->mBottom - y[i]) * aux->mWidth + x[i]; - *pixelPtr = pixel; + GLubyte * ptr = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + *((uint32 *) ptr) = pixel_color; } } } else { - for (GLuint i = 0; i < n; i++) { - GLuint *pixelPtr = (GLuint *) bitmap->Bits() - + (aux->mBottom - y[i]) * aux->mWidth + x[i]; - *pixelPtr = pixel; + for (GLuint i = 0; i < n; i++) { + GLubyte * ptr = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + *((uint32 *) ptr) = pixel_color; } } +#endif } -void AuxInfo::WriteCI32SpanBack( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteCI32SpanBack( const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLuint index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteCI8SpanBack( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteCI8SpanBack( const GLcontext *ctx, GLuint n, GLint x, GLint y, const GLubyte index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint colorIndex, const GLubyte mask[] ) { @@ -911,14 +1384,14 @@ void AuxInfo::WriteMonoCISpanBack( const GLcontext *ctx, GLuint n, } -void AuxInfo::WriteCI32PixelsBack( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteCI32PixelsBack( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], const GLuint index[], const GLubyte mask[] ) { // XXX to do } -void AuxInfo::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n, +void MesaDriver::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint colorIndex, const GLubyte mask[] ) { @@ -926,22 +1399,23 @@ void AuxInfo::WriteMonoCIPixelsBack( const GLcontext *ctx, GLuint n, } -void AuxInfo::ReadCI32SpanBack( const GLcontext *ctx, +void MesaDriver::ReadCI32SpanBack( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLuint index[] ) { // XXX to do } -void AuxInfo::ReadRGBASpanBack( const GLcontext *ctx, GLuint n, +void MesaDriver::ReadRGBASpanBack( const GLcontext *ctx, GLuint n, GLint x, GLint y, GLubyte rgba[][4] ) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - const BBitmap *bitmap = aux->mBitmap; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + const BBitmap *bitmap = md->m_bitmap; assert(bitmap); - int row = aux->mBottom - y; + int row = md->m_bottom - y; const GLubyte *pixel = (GLubyte *) bitmap->Bits() - + row * bitmap->BytesPerRow() + x * 4; + + (row * bitmap->BytesPerRow()) + x * 4; + for (GLuint i = 0; i < n; i++) { rgba[i][RCOMP] = pixel[BE_RCOMP]; rgba[i][GCOMP] = pixel[BE_GCOMP]; @@ -952,7 +1426,7 @@ void AuxInfo::ReadRGBASpanBack( const GLcontext *ctx, GLuint n, } -void AuxInfo::ReadCI32PixelsBack( const GLcontext *ctx, +void MesaDriver::ReadCI32PixelsBack( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLuint indx[], const GLubyte mask[] ) { @@ -960,319 +1434,36 @@ void AuxInfo::ReadCI32PixelsBack( const GLcontext *ctx, } -void AuxInfo::ReadRGBAPixelsBack( const GLcontext *ctx, +void MesaDriver::ReadRGBAPixelsBack( const GLcontext *ctx, GLuint n, const GLint x[], const GLint y[], GLubyte rgba[][4], const GLubyte mask[] ) { - AuxInfo *aux = (AuxInfo *) ctx->DriverCtx; - const BBitmap *bitmap = aux->mBitmap; + MesaDriver *md = (MesaDriver *) ctx->DriverCtx; + const BBitmap *bitmap = md->m_bitmap; assert(bitmap); - for (GLuint i = 0; i < n; i++) { - if (y[i] < aux->mHeight) { - const GLubyte *pixel = (const GLubyte *) bitmap->Bits() - + ((aux->mBottom - y[i]) * aux->mWidth + x[i]) * 4; + + if (mask) { + for (GLuint i = 0; i < n; i++) { + if (mask[i]) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; + rgba[i][RCOMP] = pixel[BE_RCOMP]; + rgba[i][GCOMP] = pixel[BE_GCOMP]; + rgba[i][BCOMP] = pixel[BE_BCOMP]; + rgba[i][ACOMP] = pixel[BE_ACOMP]; + }; + }; + } else { + for (GLuint i = 0; i < n; i++) { + GLubyte *pixel = (GLubyte *) bitmap->Bits() + + ((md->m_bottom - y[i]) * bitmap->BytesPerRow()) + x[i] * 4; rgba[i][RCOMP] = pixel[BE_RCOMP]; rgba[i][GCOMP] = pixel[BE_GCOMP]; rgba[i][BCOMP] = pixel[BE_BCOMP]; rgba[i][ACOMP] = pixel[BE_ACOMP]; - } - } -} - - - - -//------------------------------------------------------------------ -// Public interface methods -//------------------------------------------------------------------ - - -// -// Input: rect - initial rectangle -// name - window name -// resizingMode - example: B_FOLLOW_NONE -// mode - usually 0 ? -// options - Bitwise-OR of BGL_* tokens -// -BGLView::BGLView(BRect rect, char *name, - ulong resizingMode, ulong mode, - ulong options) - :BView(rect, name, resizingMode, mode) -{ - const GLboolean rgbFlag = (options & BGL_RGB) == BGL_RGB; - const GLboolean alphaFlag = (options & BGL_ALPHA) == BGL_ALPHA; - const GLboolean dblFlag = (options & BGL_DOUBLE) == BGL_DOUBLE; - const GLboolean stereoFlag = false; - const GLint depth = (options & BGL_DEPTH) ? 16 : 0; - const GLint stencil = (options & BGL_STENCIL) ? 8 : 0; - const GLint accum = (options & BGL_ACCUM) ? 16 : 0; - const GLint index = (options & BGL_INDEX) ? 32 : 0; - const GLint red = (options & BGL_RGB) ? 8 : 0; - const GLint green = (options & BGL_RGB) ? 8 : 0; - const GLint blue = (options & BGL_RGB) ? 8 : 0; - const GLint alpha = (options & BGL_RGB) ? 8 : 0; - - if (!rgbFlag) { - fprintf(stderr, "Mesa Warning: color index mode not supported\n"); - } - - // Allocate auxiliary data object - AuxInfo *aux = new AuxInfo; - - // examine option flags and create gl_context struct - GLvisual *visual = _mesa__create_visual( rgbFlag, - dblFlag, - stereoFlag, - red, green, blue, alpha, - index, - depth, - stencil, - accum, accum, accum, accum, - 1 - ); - - // create core framebuffer - GLframebuffer *buffer = _mesa_create_framebuffer(visual, - depth > 0 ? GL_TRUE : GL_FALSE, - stencil > 0 ? GL_TRUE: GL_FALSE, - accum > 0 ? GL_TRUE : GL_FALSE, - alphaFlag - ); - - // create core context - const GLboolean direct = GL_TRUE; - GLcontext *ctx = _mesa_create_context( visual, NULL, aux, direct ); - - _mesa_enable_sw_extensions(ctx); - - aux->Init(this, ctx, visual, buffer ); - - // Hook aux data into BGLView object - m_gc = aux; -} - - -BGLView::~BGLView() -{ - printf("BGLView destructor\n"); - AuxInfo *aux = (AuxInfo *) m_gc; - assert(aux); - delete aux; -} - -void BGLView::LockGL() -{ - AuxInfo *aux = (AuxInfo *) m_gc; - assert(aux); - aux->MakeCurrent(); -} - -void BGLView::UnlockGL() -{ - AuxInfo *aux = (AuxInfo *) m_gc; - assert(aux); - // Could call _mesa_make_current(NULL, NULL) but it would just - // hinder performance + }; + }; } -void BGLView::SwapBuffers() -{ - AuxInfo *aux = (AuxInfo *) m_gc; - assert(aux); - aux->SwapBuffers(); -} -void BGLView::CopySubBufferMESA(GLint x, GLint y, GLuint width, GLuint height) -{ - AuxInfo *aux = (AuxInfo *) m_gc; - assert(aux); - aux->CopySubBuffer(x, y, width, height); -} - - -BView *BGLView::EmbeddedView() -{ - // XXX to do - -} - -status_t BGLView::CopyPixelsOut(BPoint source, BBitmap *dest) -{ - // XXX to do -} - - -status_t BGLView::CopyPixelsIn(BBitmap *source, BPoint dest) -{ - // XXX to do -} - -void BGLView::ErrorCallback(GLenum errorCode) -{ - // XXX to do -} - -void BGLView::Draw(BRect updateRect) -{ -// printf("BGLView draw\n"); - // XXX to do -} - -void BGLView::AttachedToWindow() -{ - BView::AttachedToWindow(); - - // don't paint window background white when resized - SetViewColor(B_TRANSPARENT_32_BIT); -} - -void BGLView::AllAttached() -{ - BView::AllAttached(); -// printf("BGLView AllAttached\n"); -} - -void BGLView::DetachedFromWindow() -{ - BView::DetachedFromWindow(); -} - -void BGLView::AllDetached() -{ - BView::AllDetached(); -// printf("BGLView AllDetached"); -} - -void BGLView::FrameResized(float width, float height) -{ - return BView::FrameResized(width, height); -} - -status_t BGLView::Perform(perform_code d, void *arg) -{ - return BView::Perform(d, arg); -} - - -status_t BGLView::Archive(BMessage *data, bool deep) const -{ - return BView::Archive(data, deep); -} - -void BGLView::MessageReceived(BMessage *msg) -{ - BView::MessageReceived(msg); -} - -void BGLView::SetResizingMode(uint32 mode) -{ - BView::SetResizingMode(mode); -} - -void BGLView::Show() -{ -// printf("BGLView Show\n"); - BView::Show(); -} - -void BGLView::Hide() -{ -// printf("BGLView Hide\n"); - BView::Hide(); -} - -BHandler *BGLView::ResolveSpecifier(BMessage *msg, int32 index, - BMessage *specifier, int32 form, - const char *property) -{ - return BView::ResolveSpecifier(msg, index, specifier, form, property); -} - -status_t BGLView::GetSupportedSuites(BMessage *data) -{ - return BView::GetSupportedSuites(data); -} - -void BGLView::DirectConnected( direct_buffer_info *info ) -{ - // XXX to do -} - -void BGLView::EnableDirectMode( bool enabled ) -{ - // XXX to do -} - - - -//---- private methods ---------- - -void BGLView::_ReservedGLView1() {} -void BGLView::_ReservedGLView2() {} -void BGLView::_ReservedGLView3() {} -void BGLView::_ReservedGLView4() {} -void BGLView::_ReservedGLView5() {} -void BGLView::_ReservedGLView6() {} -void BGLView::_ReservedGLView7() {} -void BGLView::_ReservedGLView8() {} - -#if 0 -BGLView::BGLView(const BGLView &v) - : BView(v) -{ - // XXX not sure how this should work - printf("Warning BGLView::copy constructor not implemented\n"); -} -#endif - - -BGLView &BGLView::operator=(const BGLView &v) -{ - printf("Warning BGLView::operator= not implemented\n"); -} - -void BGLView::dither_front() -{ - // no-op -} - -bool BGLView::confirm_dither() -{ - // no-op - return false; -} - -void BGLView::draw(BRect r) -{ - // XXX no-op ??? -} - -/* Direct Window stuff */ -void BGLView::drawScanline( int x1, int x2, int y, void *data ) -{ - // no-op -} - -void BGLView::scanlineHandler(struct rasStateRec *state, - GLint x1, GLint x2) -{ - // no-op -} - -void BGLView::lock_draw() -{ - // no-op -} - -void BGLView::unlock_draw() -{ - // no-op -} - -bool BGLView::validateView() -{ - // no-op - return true; -} - diff --git a/src/mesa/main/Makefile.BeOS-R5 b/src/mesa/main/Makefile.BeOS-R5 new file mode 100644 index 0000000000..65303863a2 --- /dev/null +++ b/src/mesa/main/Makefile.BeOS-R5 @@ -0,0 +1,452 @@ +# Mesa 3-D graphics library +# Version: 4.1 +# +# Copyright (C) 1995-2002 Brian Paul All Rights Reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# BeOS driver makefile v1.0 for Mesa 4.1 +# +# Copyright (C) 2002 - Philippe Houdoin +# Email : philippe.houdoin@free.fr +# Web : http://philippe.houdoin.free.fr/phil/beos/index-en.html +# +# ------------------------------------------------------------------- + +## BeOS Generic Makefile v2.0 ## + +## Fill in this file to specify the project being created, and the referenced +## makefile-engine will do all of the hard work for you. This handles both +## Intel and PowerPC builds of the BeOS. + +## Application Specific Settings --------------------------------------------- + +# specify the name of the binary +NAME= libGL.so + +# specify the type of binary +# APP: Application +# SHARED: Shared library or add-on +# STATIC: Static library archive +# DRIVER: Kernel Driver +TYPE= SHARED + +# specify the source files to use +# full paths or paths relative to the makefile can be included +# all files, regardless of directory, will have their object +# files created in the common object directory. +# Note that this means this makefile will not work correctly +# if two source files with the same name (source.c or source.cpp) +# are included from different directories. Also note that spaces +# in folder names do not work well with this makefile. + +MESA_CORE_SRCS = \ + api_arrayelt.c \ + api_loopback.c \ + api_noop.c \ + api_validate.c \ + accum.c \ + attrib.c \ + blend.c \ + buffers.c \ + clip.c \ + colortab.c \ + context.c \ + convolve.c \ + debug.c \ + depth.c \ + dispatch.c \ + dlist.c \ + drawpix.c \ + enable.c \ + enums.c \ + eval.c \ + extensions.c \ + feedback.c \ + fog.c \ + get.c \ + glapi.c \ + glthread.c \ + hash.c \ + hint.c \ + histogram.c \ + image.c \ + imports.c \ + light.c \ + lines.c \ + matrix.c \ + mem.c \ + mmath.c \ + pixel.c \ + points.c \ + polygon.c \ + rastpos.c \ + state.c \ + stencil.c \ + texformat.c \ + teximage.c \ + texobj.c \ + texstate.c \ + texstore.c \ + texutil.c \ + varray.c \ + vpexec.c \ + vpparse.c \ + vpstate.c \ + vtxfmt.c \ + math/m_debug_clip.c \ + math/m_debug_norm.c \ + math/m_debug_xform.c \ + math/m_eval.c \ + math/m_matrix.c \ + math/m_translate.c \ + math/m_vector.c \ + math/m_xform.c \ + array_cache/ac_context.c \ + array_cache/ac_import.c \ + swrast/s_aaline.c \ + swrast/s_aatriangle.c \ + swrast/s_accum.c \ + swrast/s_alpha.c \ + swrast/s_alphabuf.c \ + swrast/s_bitmap.c \ + swrast/s_blend.c \ + swrast/s_buffers.c \ + swrast/s_copypix.c \ + swrast/s_context.c \ + swrast/s_depth.c \ + swrast/s_drawpix.c \ + swrast/s_feedback.c \ + swrast/s_fog.c \ + swrast/s_histogram.c \ + swrast/s_imaging.c \ + swrast/s_lines.c \ + swrast/s_logic.c \ + swrast/s_masking.c \ + swrast/s_pixeltex.c \ + swrast/s_points.c \ + swrast/s_readpix.c \ + swrast/s_span.c \ + swrast/s_stencil.c \ + swrast/s_texture.c \ + swrast/s_texstore.c \ + swrast/s_triangle.c \ + swrast/s_zoom.c \ + swrast_setup/ss_context.c \ + swrast_setup/ss_triangle.c \ + swrast_setup/ss_vb.c \ + tnl/t_array_api.c \ + tnl/t_array_import.c \ + tnl/t_context.c \ + tnl/t_eval_api.c \ + tnl/t_imm_alloc.c \ + tnl/t_imm_api.c \ + tnl/t_imm_debug.c \ + tnl/t_imm_dlist.c \ + tnl/t_imm_elt.c \ + tnl/t_imm_eval.c \ + tnl/t_imm_exec.c \ + tnl/t_imm_fixup.c \ + tnl/t_pipeline.c \ + tnl/t_vb_fog.c \ + tnl/t_vb_light.c \ + tnl/t_vb_normals.c \ + tnl/t_vb_points.c \ + tnl/t_vb_program.c \ + tnl/t_vb_render.c \ + tnl/t_vb_texgen.c \ + tnl/t_vb_texmat.c \ + tnl/t_vb_vertex.c + +MESA_BEOS_DRIVER_SRCS = \ + BeOS/GLView.cpp + +MESA_X86_SRCS = \ + X86/x86.c \ + X86/glapi_x86.S \ + X86/common_x86.c \ + X86/common_x86_asm.S \ + X86/x86_xform2.S \ + X86/x86_xform3.S \ + X86/x86_xform4.S \ + X86/x86_cliptest.S + +MESA_MMX_SRCS = \ + X86/mmx_blend.S + +MESA_SSE_SRCS = \ + X86/sse.c \ + X86/sse_xform2.S \ + X86/sse_xform3.S \ + X86/sse_xform4.S \ + X86/sse_normal.S + +MESA_3DNOW_SRCS = \ + X86/3dnow.c \ + X86/3dnow_normal.S \ + X86/3dnow_xform1.S \ + X86/3dnow_xform2.S \ + X86/3dnow_xform3.S \ + X86/3dnow_xform4.S + +MESA_DEFINES = +# To use GAS assembler, uncomment this line instead: +MESA_DEFINES += GNU_ASSEMBLER +# To use NASM assembler, uncomment this line instead: +# MESA_DEFINES += NASM_ASSEMBLER +# To build a DEBUG version of Mesa, uncomment this line instead: +# MESA_DEFINES += DEBUG + +# x86-optimized code +MACHINE=$(shell uname -m) +ifeq ($(MACHINE), BePC) + HAVE_MMX = 1 + HAVE_SSE = 1 + HAVE_3DNOW = 1 +else + # No assembly optimization for PowerPC... + # HAVE_ALTIVEC=1 +endif + +ifdef HAVE_MMX + MESA_X86_SRCS += $(MESA_MMX_SRCS) + MESA_DEFINES += USE_MMX_ASM + HAVE_X86 = 1 +endif +ifdef HAVE_SSE + MESA_X86_SRCS += $(MESA_SSE_SRCS) + MESA_DEFINES += USE_SSE_ASM + HAVE_X86 = 1 +endif +ifdef HAVE_3DNOW + MESA_X86_SRCS += $(MESA_3DNOW_SRCS) + MESA_DEFINES += USE_3DNOW_ASM + HAVE_X86 = 1 +endif +ifdef HAVE_X86 + MESA_DEFINES += USE_X86_ASM +else + MESA_X86_SRCS = +endif + +# FIXME: SI-GLU version support currently broken +# USE_SI_GLU=1 +ifdef USE_SI_GLU + GLU_SRCS = \ + ../si-glu/libutil/error.c \ + ../si-glu/libutil/glue.c \ + ../si-glu/libutil/mipmap.c \ + ../si-glu/libutil/project.c \ + ../si-glu/libutil/quad.c \ + ../si-glu/libutil/registry.c \ + ../si-glu/libtess/dict.c \ + ../si-glu/libtess/geom.c \ + ../si-glu/libtess/memalloc.c \ + ../si-glu/libtess/mesh.c \ + ../si-glu/libtess/normal.c \ + ../si-glu/libtess/priorityq.c \ + ../si-glu/libtess/render.c \ + ../si-glu/libtess/sweep.c \ + ../si-glu/libtess/tess.c \ + ../si-glu/libtess/tessmono.c \ + ../si-glu/libnurbs/interface/bezierEval.cc \ + ../si-glu/libnurbs/interface/bezierPatch.cc \ + ../si-glu/libnurbs/interface/bezierPatchMesh.cc \ + ../si-glu/libnurbs/interface/glcurveval.cc \ + ../si-glu/libnurbs/interface/glinterface.cc \ + ../si-glu/libnurbs/interface/glrenderer.cc \ + ../si-glu/libnurbs/interface/glsurfeval.cc \ + ../si-glu/libnurbs/interface/incurveeval.cc \ + ../si-glu/libnurbs/interface/insurfeval.cc \ + ../si-glu/libnurbs/internals/arc.cc \ + ../si-glu/libnurbs/internals/arcsorter.cc \ + ../si-glu/libnurbs/internals/arctess.cc \ + ../si-glu/libnurbs/internals/backend.cc \ + ../si-glu/libnurbs/internals/basiccrveval.cc \ + ../si-glu/libnurbs/internals/basicsurfeval.cc \ + ../si-glu/libnurbs/internals/bin.cc \ + ../si-glu/libnurbs/internals/bufpool.cc \ + ../si-glu/libnurbs/internals/cachingeval.cc \ + ../si-glu/libnurbs/internals/ccw.cc \ + ../si-glu/libnurbs/internals/coveandtiler.cc \ + ../si-glu/libnurbs/internals/curve.cc \ + ../si-glu/libnurbs/internals/curvelist.cc \ + ../si-glu/libnurbs/internals/curvesub.cc \ + ../si-glu/libnurbs/internals/dataTransform.cc \ + ../si-glu/libnurbs/internals/displaylist.cc \ + ../si-glu/libnurbs/internals/flist.cc \ + ../si-glu/libnurbs/internals/flistsorter.cc \ + ../si-glu/libnurbs/internals/hull.cc \ + ../si-glu/libnurbs/internals/intersect.cc \ + ../si-glu/libnurbs/internals/knotvector.cc \ + ../si-glu/libnurbs/internals/mapdesc.cc \ + ../si-glu/libnurbs/internals/mapdescv.cc \ + ../si-glu/libnurbs/internals/maplist.cc \ + ../si-glu/libnurbs/internals/mesher.cc \ + ../si-glu/libnurbs/internals/monoTriangulationBackend.cc \ + ../si-glu/libnurbs/internals/monotonizer.cc \ + ../si-glu/libnurbs/internals/mycode.cc \ + ../si-glu/libnurbs/internals/nurbsinterfac.cc \ + ../si-glu/libnurbs/internals/nurbstess.cc \ + ../si-glu/libnurbs/internals/patch.cc \ + ../si-glu/libnurbs/internals/patchlist.cc \ + ../si-glu/libnurbs/internals/quilt.cc \ + ../si-glu/libnurbs/internals/reader.cc \ + ../si-glu/libnurbs/internals/renderhints.cc \ + ../si-glu/libnurbs/internals/slicer.cc \ + ../si-glu/libnurbs/internals/sorter.cc \ + ../si-glu/libnurbs/internals/splitarcs.cc \ + ../si-glu/libnurbs/internals/subdivider.cc \ + ../si-glu/libnurbs/internals/tobezier.cc \ + ../si-glu/libnurbs/internals/trimline.cc \ + ../si-glu/libnurbs/internals/trimregion.cc \ + ../si-glu/libnurbs/internals/trimvertpool.cc \ + ../si-glu/libnurbs/internals/uarray.cc \ + ../si-glu/libnurbs/internals/varray.cc \ + ../si-glu/libnurbs/nurbtess/directedLine.cc \ + ../si-glu/libnurbs/nurbtess/gridWrap.cc \ + ../si-glu/libnurbs/nurbtess/monoChain.cc \ + ../si-glu/libnurbs/nurbtess/monoPolyPart.cc \ + ../si-glu/libnurbs/nurbtess/monoTriangulation.cc \ + ../si-glu/libnurbs/nurbtess/partitionX.cc \ + ../si-glu/libnurbs/nurbtess/partitionY.cc \ + ../si-glu/libnurbs/nurbtess/polyDBG.cc \ + ../si-glu/libnurbs/nurbtess/polyUtil.cc \ + ../si-glu/libnurbs/nurbtess/primitiveStream.cc \ + ../si-glu/libnurbs/nurbtess/quicksort.cc \ + ../si-glu/libnurbs/nurbtess/rectBlock.cc \ + ../si-glu/libnurbs/nurbtess/sampleComp.cc \ + ../si-glu/libnurbs/nurbtess/sampleCompBot.cc \ + ../si-glu/libnurbs/nurbtess/sampleCompRight.cc \ + ../si-glu/libnurbs/nurbtess/sampleCompTop.cc \ + ../si-glu/libnurbs/nurbtess/sampleMonoPoly.cc \ + ../si-glu/libnurbs/nurbtess/sampledLine.cc \ + ../si-glu/libnurbs/nurbtess/searchTree.cc +else + GLU_SRCS = \ + ../src-glu/glu.c \ + ../src-glu/mipmap.c \ + ../src-glu/project.c \ + ../src-glu/quadric.c \ + ../src-glu/tess.c \ + ../src-glu/tesselat.c \ + ../src-glu/polytest.c \ + ../src-glu/nurbs.c \ + ../src-glu/nurbscrv.c \ + ../src-glu/nurbssrf.c \ + ../src-glu/nurbsutl.c +endif + +SRCS = $(MESA_CORE_SRCS) $(MESA_X86_SRCS) $(GLU_SRCS) $(MESA_BEOS_DRIVER_SRCS) + +# specify the resource files to use +# full path or a relative path to the resource file can be used. +RSRCS = + +# specify additional libraries to link against +# there are two acceptable forms of library specifications +# - if your library follows the naming pattern of: +# libXXX.so or libXXX.a you can simply specify XXX +# library: libbe.so entry: be +# +# - if your library does not follow the standard library +# naming scheme you need to specify the path to the library +# and it's name +# library: my_lib.a entry: my_lib.a or path/my_lib.a +LIBS = be + +# specify additional paths to directories following the standard +# libXXX.so or libXXX.a naming scheme. You can specify full paths +# or paths relative to the makefile. The paths included may not +# be recursive, so include all of the paths where libraries can +# be found. Directories where source files are found are +# automatically included. +LIBPATHS = + +# additional paths to look for system headers +# thes use the form: #include
+# source file directories are NOT auto-included here +SYSTEM_INCLUDE_PATHS = ../include +ifdef USE_SI_GLU + SYSTEM_INCLUDE_PATHS += ../si-glu/include +endif + +# additional paths to look for local headers +# thes use the form: #include "header" +# source file directories are automatically included +LOCAL_INCLUDE_PATHS = + +# specify the level of optimization that you desire +# NONE, SOME, FULL +OPTIMIZE = FULL + +# specify any preprocessor symbols to be defined. The symbols +# will be set to a value of 1. For example specify DEBUG if you want +# DEBUG=1 to be set when compiling. +DEFINES = $(MESA_DEFINES) + +# specify special warning levels +# if unspecified default warnings will be used +# NONE = suppress all warnings +# ALL = enable all warnings +WARNINGS = ALL + +# specify whether image symbols will be created +# so that stack crawls in the debugger are meaningful +# if TRUE symbols will be created +SYMBOLS = TRUE + +# specify debug settings +# if TRUE will allow application to be run from +# a source-level debugger +# DEBUGGER = TRUE +DEBUGGER = FALSE + +# specify additional compiler flags for all files +COMPILER_FLAGS = + +# specify additional linker flags +LINKER_FLAGS = + + + +## include the makefile-engine +include /boot/develop/etc/makefile-engine + + + +# X86/matypes.h include file is *generated*! +# Rules to (re)generate it as needed: + +X86/common_x86_asm.S : X86/matypes.h + +X86/matypes.h : X86/gen_matypes.c + @echo "(Re-)Generating $@ ..." + $(CC) $< $(INCLUDES) $(CFLAGS) -o X86/gen_matypes + X86/gen_matypes > $@ + rm -f X86/gen_matypes + +## Add NASM support for assembly code compilation... +# $(OBJ_DIR)/%.o : %.nasm +# nasm -f elf $(MESA_DEFINES) -o $@ $< + +$(OBJ_DIR)/%.o : %.S + gcc -c $< $(INCLUDES) $(CFLAGS) -o $@ +# gcc $(INCLUDES) $(CFLAGS) -E $< | grep -v '^$$' > $(addsuffix .nasm, $(basename $<)) +# nasm -f elf $(MESA_DEFINES) -o $@ $(addsuffix .nasm, $(basename $<)) + diff --git a/src/mesa/x86/gen_matypes.c b/src/mesa/x86/gen_matypes.c index 8a86d69694..b97a70528c 100644 --- a/src/mesa/x86/gen_matypes.c +++ b/src/mesa/x86/gen_matypes.c @@ -1,4 +1,4 @@ -/* $Id: gen_matypes.c,v 1.7 2002/02/15 16:32:36 brianp Exp $ */ +/* $Id: gen_matypes.c,v 1.8 2002/09/19 16:19:45 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -66,11 +66,21 @@ do { \ printf( "\n" ); \ } while (0) +#if defined(__BEOS__) +#define OFFSET( s, t, m ) \ + printf( "#define %s\t%ld\n", s, offsetof( t, m ) ); +#else #define OFFSET( s, t, m ) \ printf( "#define %s\t%d\n", s, offsetof( t, m ) ); +#endif +#if defined(__BEOS__) +#define SIZEOF( s, t ) \ + printf( "#define %s\t%ld\n", s, sizeof(t) ); +#else #define SIZEOF( s, t ) \ printf( "#define %s\t%d\n", s, sizeof(t) ); +#endif #define DEFINE( s, d ) \ printf( "#define %s\t0x%x\n", s, d ); -- cgit v1.2.3