swrast: Fix inverted rendering
* Override swrast RenderBuffer mapping function so we can invert Y at rendertime.
This commit is contained in:
@@ -105,11 +105,12 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
|
|||||||
// Initialize device driver function table
|
// Initialize device driver function table
|
||||||
_mesa_init_driver_functions(&functions);
|
_mesa_init_driver_functions(&functions);
|
||||||
|
|
||||||
functions.GetString = _GetString;
|
functions.GetString = _GetString;
|
||||||
functions.UpdateState = _UpdateState;
|
functions.UpdateState = _UpdateState;
|
||||||
|
functions.MapRenderbuffer = _RenderBufferMap;
|
||||||
functions.GetBufferSize = NULL;
|
functions.GetBufferSize = NULL;
|
||||||
functions.Error = _Error;
|
functions.Error = _Error;
|
||||||
functions.Flush = _Flush;
|
functions.Flush = _Flush;
|
||||||
|
|
||||||
// create core context
|
// create core context
|
||||||
fContext = _mesa_create_context(API_OPENGL, fVisual, NULL,
|
fContext = _mesa_create_context(API_OPENGL, fVisual, NULL,
|
||||||
@@ -423,6 +424,7 @@ void
|
|||||||
MesaSoftwareRenderer::_AllocateBitmap()
|
MesaSoftwareRenderer::_AllocateBitmap()
|
||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
|
||||||
// allocate new size of back buffer bitmap
|
// allocate new size of back buffer bitmap
|
||||||
delete fBitmap;
|
delete fBitmap;
|
||||||
fBitmap = NULL;
|
fBitmap = NULL;
|
||||||
@@ -434,14 +436,15 @@ MesaSoftwareRenderer::_AllocateBitmap()
|
|||||||
|
|
||||||
BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1);
|
BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1);
|
||||||
fBitmap = new BBitmap(rect, fColorSpace);
|
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 0
|
||||||
//if (fVisual->doubleBufferMode)
|
// Used for platform optimized drawing
|
||||||
// fBackRenderBuffer->size = fBitmap->BitsLength();
|
for (uint i = 0; i < fHeight; i++) {
|
||||||
|
fRowAddr[fHeight - i - 1] = (GLvoid *)((GLubyte *)fBitmap->Bits()
|
||||||
|
+ i * fBitmap->BytesPerRow());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
fFrameBuffer->Width = fWidth;
|
fFrameBuffer->Width = fWidth;
|
||||||
fFrameBuffer->Height = fHeight;
|
fFrameBuffer->Height = fHeight;
|
||||||
TRACE("%s: Bitmap Size: %" B_PRIu32 "\n", __func__, fBitmap->BitsLength());
|
TRACE("%s: Bitmap Size: %" B_PRIu32 "\n", __func__, fBitmap->BitsLength());
|
||||||
@@ -547,6 +550,7 @@ MesaSoftwareRenderer::_NewRenderBuffer(bool front)
|
|||||||
|
|
||||||
_mesa_init_renderbuffer(&swRenderBuffer->Base, 0);
|
_mesa_init_renderbuffer(&swRenderBuffer->Base, 0);
|
||||||
|
|
||||||
|
swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS;
|
||||||
swRenderBuffer->Base.RefCount = 1;
|
swRenderBuffer->Base.RefCount = 1;
|
||||||
swRenderBuffer->Base.Delete = _RenderBufferDelete;
|
swRenderBuffer->Base.Delete = _RenderBufferDelete;
|
||||||
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
|
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
|
||||||
@@ -566,7 +570,6 @@ MesaSoftwareRenderer::_SetupRenderBuffer(struct gl_renderbuffer* rb,
|
|||||||
{
|
{
|
||||||
CALLED();
|
CALLED();
|
||||||
|
|
||||||
//buffer->DataType = GL_UNSIGNED_BYTE;
|
|
||||||
rb->InternalFormat = GL_RGBA;
|
rb->InternalFormat = GL_RGBA;
|
||||||
|
|
||||||
switch (colorSpace) {
|
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
|
void
|
||||||
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
|
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
#define MESASOFTWARERENDERER_H
|
#define MESASOFTWARERENDERER_H
|
||||||
|
|
||||||
|
|
||||||
|
#define HAIKU_SWRAST_RENDERBUFFER_CLASS 0x737752 // swR
|
||||||
|
|
||||||
|
|
||||||
#include "GLRenderer.h"
|
#include "GLRenderer.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -57,6 +60,11 @@ private:
|
|||||||
struct gl_renderbuffer* render,
|
struct gl_renderbuffer* render,
|
||||||
GLenum internalFormat,
|
GLenum internalFormat,
|
||||||
GLuint width, GLuint height);
|
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 _AllocateBitmap();
|
||||||
void _CopyToDirect();
|
void _CopyToDirect();
|
||||||
@@ -79,6 +87,8 @@ private:
|
|||||||
GLuint fNewWidth;
|
GLuint fNewWidth;
|
||||||
GLuint fNewHeight;
|
GLuint fNewHeight;
|
||||||
color_space fColorSpace;
|
color_space fColorSpace;
|
||||||
|
|
||||||
|
void* fRowAddr[SWRAST_MAX_HEIGHT];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MESASOFTWARERENDERER_H
|
#endif // MESASOFTWARERENDERER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user