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) --- docs/README.BEOS | 60 +- include/GL/gl.h | 13 +- progs/beos/sample.cpp | 45 +- src/mesa/drivers/beos/GLView.cpp | 1725 +++++++++++++++++++++----------------- src/mesa/main/Makefile.BeOS-R5 | 452 ++++++++++ src/mesa/x86/gen_matypes.c | 12 +- 6 files changed, 1494 insertions(+), 813 deletions(-) create mode 100644 src/mesa/main/Makefile.BeOS-R5 diff --git a/docs/README.BEOS b/docs/README.BEOS index 92849ef7aa4..6d1e1f0e41b 100644 --- a/docs/README.BEOS +++ b/docs/README.BEOS @@ -3,61 +3,71 @@ -Introduction +* Introduction -Mesa 3.1 features a new driver for the BeOS. The new driver implements +Mesa 4.1 features a driver for the BeOS. The driver implements a clone of the BGLView class. This class, derived from BView, allows OpenGL rendering into a BeOS window. +The 4.1 BeOS driver is an update of Brian Paul's BeOS driver released in Mesa 3.1. Any application which uses the BGLView should be able to use Mesa instead of Be's OpenGL without changing any code. -Since Be's OpenGL implementation (as of R4) is basically just the +Since Be's OpenGL implementation (as of R5) is basically just the SGI sample implementation, it's pretty slow. You'll see that Mesa is considerably faster. -Source Code +* Source Code -The source code for the driver is in Mesa-3.1/src/BeOS/GLView.cpp +The source code for the driver is in Mesa-4.1/src/BeOS/ directory. It's not 100% finished at this time but many GLUT-based demos are working. No optimizations have been made at this time. -Compiling +* Compiling -In the Mesa-3.x directory type "make -f Makefile.X11 beos-r4". -When it finishes the libMesaGL.so and libMesaGLU.so libraries for -BeOS will be in the Mesa-3.x/lib/ directory. +Requirements: + - gcc version 2.95.3 for BeOS + You can find it here: http://www.bebits.com/app/2157 +Move to the Mesa-4.x src sub-directory and then type "make -f Makefile.BeOS-R5". +When it finishes the Mesa based libGL.so library for +BeOS will be in the Mesa-4.x/src/obj.{x86|ppc}/ directory. +To install it as Be's default libGL.so replacement, put it in your +/boot/home/config/lib/ directory. All your GL/GLUTapps will use +the Mesa based then. -Example Programs +By default, it build a non-debug version library. +The x86 (MMX, SSE and 3DNOW) optimizations are also supported for x86 target. +Sorry, Mesa don't have ppc (Altivec) optimizations yet. -Look in the Mesa-3.x/BeOS/ directory for one or two BGLView demo + +* Example Programs + +Look in the Mesa-4.x/BeOS/ directory for one or two BGLView demo programs. They should have been compiled along with the Mesa library. +* GLUT -GLUT - -A version of GLUT 2.5 for BeOS can be found in src-glut.beos/. +A beta version of GLUT 3.7 port for BeOS can be found at +http://anobject.com/jehamby/Code/Glut-3.7-x86.zip. + +There's is a 2.5 version in src-glut.beos/, too. The original distribution can be obtained from http://home.beoscentral.com/jehamby/Glut-3.5-x86.zip -This is a special version of GLUT adapted for the BeOS. I don't +They are special version of GLUT adapted for the BeOS. I don't believe Mark Kilgard's normal GLUT distribution includes BeOS support. -It seems that you have to recompile GLUT with libMesaGL.so instead -of libGL.so in order for everything to work. I'm not sure why. - - -Special Features +* Special Features Mesa's implementation of the BGLView class has an extra member function: CopySubBufferMESA(). It basically works like SwapBuffers() @@ -69,7 +79,9 @@ cause a fatal error when running with Be's OpenGL. -Work Left To Do +* Work Left To Do + +BDirectWindow single buffering support is not implemented yet. Color index mode is not implemented yet. @@ -80,7 +92,7 @@ rendering. This should also be implemented for Mesa. -Old BeOS Driver +* Old BeOS Driver Mesa 2.6 had an earlier BeOS driver. It was based on Mesa's Off-screen rendering interface, not BGLView. If you're interested in the older @@ -88,7 +100,7 @@ driver you should get Mesa 2.6. -BeOS and Glide +* BeOS and Glide Mesa 3.0 supported the 3Dfx/Glide library on Beos. Download Mesa 3.0 if interested. Ideally, the 3Dfx/Glide support should be updated to @@ -99,4 +111,4 @@ of February, 1999. ---------------------------------------------------------------------- -$Id: README.BEOS,v 1.6 1999/11/27 01:40:40 brianp Exp $ +$Id: README.BEOS,v 1.7 2002/09/19 16:19:44 brianp Exp $ diff --git a/include/GL/gl.h b/include/GL/gl.h index 5808d5088fd..4b3a411909e 100644 --- a/include/GL/gl.h +++ b/include/GL/gl.h @@ -1,4 +1,4 @@ -/* $Id: gl.h,v 1.69 2002/09/06 02:52:23 brianp Exp $ */ +/* $Id: gl.h,v 1.70 2002/09/19 16:19:45 brianp Exp $ */ /* * Mesa 3-D graphics library @@ -63,6 +63,10 @@ # define GLAPIENTRY #endif /* WIN32 / CYGWIN bracket */ +#if (defined(__BEOS__) && defined(__POWERPC__)) || defined(__QUICKDRAW__) +# define PRAGMA_EXPORT_SUPPORTED 1 +#endif + #if defined(_WIN32) && !defined(_WINGDI_) && !defined(_GNU_H_WINDOWS32_DEFINES) && !defined(OPENSTEP) && !defined(__CYGWIN__) #include #endif @@ -79,10 +83,10 @@ #define signed #endif - -#if defined(__BEOS__) || defined(__QUICKDRAW__) +#if defined(PRAGMA_EXPORT_SUPPORTED) #pragma export on #endif + /* * End system-specific stuff. **********************************************************************/ @@ -726,6 +730,7 @@ typedef double GLclampd; /* double precision float in [0,1] */ #define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF + /* * Miscellaneous */ @@ -2593,7 +2598,7 @@ GLAPI void GLAPIENTRY glTracePointerRangeMESA( const GLvoid* first, const GLvoid /********************************************************************** * Begin system-specific stuff */ -#if defined(__BEOS__) || defined(__QUICKDRAW__) +#if defined(PRAGMA_EXPORT_SUPPORTED) #pragma export off #endif diff --git a/progs/beos/sample.cpp b/progs/beos/sample.cpp index 2310b33882d..7b8515b275c 100644 --- a/progs/beos/sample.cpp +++ b/progs/beos/sample.cpp @@ -32,7 +32,7 @@ class SampleGLWindow : public BWindow { public: SampleGLWindow(BRect frame, uint32 type); - virtual bool QuitRequested() { return true; } + virtual bool QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; } private: SampleGLView *theView; @@ -135,7 +135,7 @@ void SampleGLView::gInit(void) use_stipple_mode = GL_FALSE; use_smooth_mode = GL_TRUE; linesize = 2; - pointsize = 4; + pointsize = 6; } @@ -147,35 +147,46 @@ void SampleGLView::gDraw(void) glClear(GL_COLOR_BUFFER_BIT); glLineWidth(linesize); +/* + if (use_stipple_mode) { glEnable(GL_LINE_STIPPLE); } else { glDisable(GL_LINE_STIPPLE); } - - if (use_smooth_mode) { - glEnable(GL_LINE_SMOOTH); - glEnable(GL_BLEND); - } else { - glDisable(GL_LINE_SMOOTH); - glDisable(GL_BLEND); - } - +*/ + + glDisable(GL_POINT_SMOOTH); + + glPushMatrix(); + glPointSize(pointsize); // Set size for point + for (i = 0; i < 360; i += 5) { glRotatef(5.0, 0,0,1); // Rotate right 5 degrees + + if (use_smooth_mode) { + glEnable(GL_LINE_SMOOTH); + glEnable(GL_BLEND); + } else { + glDisable(GL_LINE_SMOOTH); + glDisable(GL_BLEND); + } + glColor3f(1.0, 1.0, 0.0); // Set color for line glBegin(GL_LINE_STRIP); // And create the line - glVertex3fv(pntA); - glVertex3fv(pntB); + glVertex3fv(pntA); + glVertex3fv(pntB); glEnd(); - - glPointSize(pointsize); // Set size for point + + glDisable(GL_POINT_SMOOTH); + glDisable(GL_BLEND); + glColor3f(0.0, 1.0, 0.0); // Set color for point glBegin(GL_POINTS); - glVertex3fv(pntA); // Draw point at one end - glVertex3fv(pntB); // Draw point at other end + glVertex3fv(pntA); // Draw point at one end + glVertex3fv(pntB); // Draw point at other end glEnd(); } diff --git a/src/mesa/drivers/beos/GLView.cpp b/src/mesa/drivers/beos/GLView.cpp index 56c1b7773b9..b96b4e82893 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 00000000000..65303863a23 --- /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 8a86d696948..b97a70528c6 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