From d0df888925e4bb873df299d6df87f26b60fb4850 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Fri, 30 Mar 2012 16:43:21 -0500 Subject: [PATCH] swrast: Fix inverted rendering * Override swrast RenderBuffer mapping function so we can invert Y at rendertime. --- .../opengl/swrast/MesaSoftwareRenderer.cpp | 56 +++++++++++++++---- .../opengl/swrast/MesaSoftwareRenderer.h | 10 ++++ 2 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp index a722d06888..2bbdfbfd30 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp @@ -105,11 +105,12 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, // Initialize device driver function table _mesa_init_driver_functions(&functions); - functions.GetString = _GetString; - functions.UpdateState = _UpdateState; + functions.GetString = _GetString; + functions.UpdateState = _UpdateState; + functions.MapRenderbuffer = _RenderBufferMap; functions.GetBufferSize = NULL; - functions.Error = _Error; - functions.Flush = _Flush; + functions.Error = _Error; + functions.Flush = _Flush; // create core context fContext = _mesa_create_context(API_OPENGL, fVisual, NULL, @@ -423,6 +424,7 @@ void MesaSoftwareRenderer::_AllocateBitmap() { CALLED(); + // allocate new size of back buffer bitmap delete fBitmap; fBitmap = NULL; @@ -434,14 +436,15 @@ MesaSoftwareRenderer::_AllocateBitmap() BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1); fBitmap = new BBitmap(rect, fColorSpace); - //for (uint i = 0; i < fHeight; i++) { - // fRowAddr[fHeight - i - 1] = (GLvoid *)((GLubyte *)fBitmap->Bits() - // + i * fBitmap->BytesPerRow()); - //} - //fFrontRenderBuffer->size = fBitmap->BitsLength(); - //if (fVisual->doubleBufferMode) - // fBackRenderBuffer->size = fBitmap->BitsLength(); + #if 0 + // Used for platform optimized drawing + for (uint i = 0; i < fHeight; i++) { + fRowAddr[fHeight - i - 1] = (GLvoid *)((GLubyte *)fBitmap->Bits() + + i * fBitmap->BytesPerRow()); + } + #endif + fFrameBuffer->Width = fWidth; fFrameBuffer->Height = fHeight; TRACE("%s: Bitmap Size: %" B_PRIu32 "\n", __func__, fBitmap->BitsLength()); @@ -547,6 +550,7 @@ MesaSoftwareRenderer::_NewRenderBuffer(bool front) _mesa_init_renderbuffer(&swRenderBuffer->Base, 0); + swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS; swRenderBuffer->Base.RefCount = 1; swRenderBuffer->Base.Delete = _RenderBufferDelete; swRenderBuffer->Base.AllocStorage = _RenderBufferStorage; @@ -566,7 +570,6 @@ MesaSoftwareRenderer::_SetupRenderBuffer(struct gl_renderbuffer* rb, { CALLED(); - //buffer->DataType = GL_UNSIGNED_BYTE; rb->InternalFormat = GL_RGBA; switch (colorSpace) { @@ -600,6 +603,35 @@ MesaSoftwareRenderer::_SetupRenderBuffer(struct gl_renderbuffer* rb, } +/*! Y inverted Map RenderBuffer function + We use a BBitmap for storage which has Y inverted. + If the Mesa provided Map function ever allows external + control of this we can omit this function. +*/ +void +MesaSoftwareRenderer::_RenderBufferMap(gl_context *ctx, + struct gl_renderbuffer *rb, GLuint x, GLuint y, GLuint w, GLuint h, + GLbitfield mode, GLubyte **mapOut, GLint *rowStrideOut) +{ + if (rb->ClassID == HAIKU_SWRAST_RENDERBUFFER_CLASS) { + /* this is an OSMesa renderbuffer which wraps user memory */ + struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); + const GLuint bpp = _mesa_get_format_bytes(rb->Format); + GLint rowStride; /* in bytes */ + + rowStride = rb->Width * bpp; + + y = rb->Height - y - 1; + + *rowStrideOut = -rowStride; + *mapOut = (GLubyte *) srb->Buffer + y * rowStride + x * bpp; + } else { + _swrast_map_soft_renderbuffer(ctx, rb, x, y, w, h, mode, + mapOut, rowStrideOut); + } +} + + void MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb) { diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h index ca6ca95f95..3617ad1ac1 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h @@ -11,6 +11,9 @@ #define MESASOFTWARERENDERER_H +#define HAIKU_SWRAST_RENDERBUFFER_CLASS 0x737752 // swR + + #include "GLRenderer.h" extern "C" { @@ -57,6 +60,11 @@ private: struct gl_renderbuffer* render, GLenum internalFormat, GLuint width, GLuint height); + static void _RenderBufferMap(gl_context *ctx, + struct gl_renderbuffer *rb, + GLuint x, GLuint y, GLuint w, GLuint h, + GLbitfield mode, GLubyte **mapOut, + GLint *rowStrideOut); void _AllocateBitmap(); void _CopyToDirect(); @@ -79,6 +87,8 @@ private: GLuint fNewWidth; GLuint fNewHeight; color_space fColorSpace; + + void* fRowAddr[SWRAST_MAX_HEIGHT]; }; #endif // MESASOFTWARERENDERER_H