swrast: Fix inverted rendering

* Override swrast RenderBuffer mapping function
  so we can invert Y at rendertime.
This commit is contained in:
Alexander von Gluck IV 2012-03-30 16:43:21 -05:00
parent df82ad659d
commit d0df888925
2 changed files with 54 additions and 12 deletions

@ -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)
{

@ -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