swrast: Initial rewrite for new Mesa

* Stop using internal fb and rb wrappers
* Stop doing Get/Put Row
* Stop malloc'ing buffers
* Tons of other changes
This commit is contained in:
Alexander von Gluck IV
2012-03-30 13:02:40 -05:00
parent a37e0c23c8
commit 065cba5314
2 changed files with 74 additions and 129 deletions
@@ -169,14 +169,12 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
_mesa_enable_2_1_extensions(fContext);
// create core framebuffer
fFrameBuffer = (struct msr_framebuffer*)calloc(1,
sizeof(*fFrameBuffer));
fFrameBuffer = _mesa_create_framebuffer(fVisual);
if (fFrameBuffer == NULL) {
ERROR("%s: Unable to calloc GL FrameBuffer!\n", __func__);
_mesa_destroy_visual(fVisual);
return;
}
_mesa_initialize_window_framebuffer(&fFrameBuffer->base, fVisual);
// Setup front render buffer
fFrontRenderBuffer = _NewRenderBuffer(true);
@@ -187,8 +185,8 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
free(fFrameBuffer);
return;
}
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT,
&fFrontRenderBuffer->base);
_mesa_add_renderbuffer(fFrameBuffer, BUFFER_FRONT_LEFT,
&fFrontRenderBuffer->Base);
// Setup back render buffer (if requested)
if (fVisual->doubleBufferMode) {
@@ -200,11 +198,11 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
free(fFrameBuffer);
return;
}
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT,
&fBackRenderBuffer->base);
_mesa_add_renderbuffer(fFrameBuffer, BUFFER_BACK_LEFT,
&fBackRenderBuffer->Base);
}
_swrast_add_soft_renderbuffers(&fFrameBuffer->base, GL_FALSE,
_swrast_add_soft_renderbuffers(fFrameBuffer, GL_FALSE,
fVisual->haveDepthBuffer, fVisual->haveStencilBuffer,
fVisual->haveAccumBuffer, alphaFlag, GL_FALSE);
@@ -231,7 +229,7 @@ MesaSoftwareRenderer::~MesaSoftwareRenderer()
_tnl_DestroyContext(fContext);
_vbo_DestroyContext(fContext);
_mesa_destroy_visual(fVisual);
_mesa_destroy_framebuffer(&fFrameBuffer->base);
_mesa_destroy_framebuffer(fFrameBuffer);
_mesa_destroy_context(fContext);
free(fInfo);
@@ -247,7 +245,7 @@ MesaSoftwareRenderer::LockGL()
CALLED();
BGLRenderer::LockGL();
_mesa_make_current(fContext, &fFrameBuffer->base, &fFrameBuffer->base);
_mesa_make_current(fContext, fFrameBuffer, fFrameBuffer);
color_space colorSpace = BScreen(GLView()->Window()).ColorSpace();
@@ -261,9 +259,9 @@ MesaSoftwareRenderer::LockGL()
if (fColorSpace != colorSpace) {
fColorSpace = colorSpace;
_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace);
_SetupRenderBuffer(&fFrontRenderBuffer->Base, fColorSpace);
if (fVisual->doubleBufferMode)
_SetupRenderBuffer(fBackRenderBuffer, fColorSpace);
_SetupRenderBuffer(&fBackRenderBuffer->Base, fColorSpace);
}
_CheckResize();
@@ -444,7 +442,7 @@ MesaSoftwareRenderer::_CheckResize()
fHeight = fNewHeight;
fWidth = fNewWidth;
_mesa_resize_framebuffer(fContext, &fFrameBuffer->base, fWidth, fHeight);
_mesa_resize_framebuffer(fContext, fFrameBuffer, fWidth, fHeight);
_AllocateBitmap();
}
@@ -465,19 +463,19 @@ 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());
}
//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();
fFrameBuffer->width = fWidth;
fFrameBuffer->height = fHeight;
//fFrontRenderBuffer->size = fBitmap->BitsLength();
//if (fVisual->doubleBufferMode)
// fBackRenderBuffer->size = fBitmap->BitsLength();
fFrameBuffer->Width = fWidth;
fFrameBuffer->Height = fHeight;
TRACE("%s: Bitmap Size: %" B_PRIu32 "\n", __func__, fBitmap->BitsLength());
fFrontRenderBuffer->base.Data = fBitmap->Bits();
fFrontRenderBuffer->Buffer = (GLubyte*)fBitmap->Bits();
}
@@ -525,12 +523,14 @@ MesaSoftwareRenderer::_Viewport(gl_context* ctx, GLint x, GLint y, GLsizei w,
{
CALLED();
gl_framebuffer* draw = ctx->WinSysDrawBuffer;
gl_framebuffer* read = ctx->WinSysReadBuffer;
struct msr_framebuffer* msr = msr_framebuffer(draw);
// TODO
//gl_framebuffer* draw = ctx->WinSysDrawBuffer;
//gl_framebuffer* read = ctx->WinSysReadBuffer;
_mesa_resize_framebuffer(ctx, draw, msr->width, msr->height);
_mesa_resize_framebuffer(ctx, read, msr->width, msr->height);
//struct swrast_renderbuffer* msr = haikuFrameBuffer(draw);
//_mesa_resize_framebuffer(ctx, draw, msr->width, msr->height);
//_mesa_resize_framebuffer(ctx, read, msr->width, msr->height);
}
@@ -594,35 +594,14 @@ MesaSoftwareRenderer::_ClearFront(gl_context* ctx)
GLboolean
MesaSoftwareRenderer::_FrontRenderbufferStorage(gl_context* ctx,
MesaSoftwareRenderer::_RenderBufferStorage(gl_context* ctx,
struct gl_renderbuffer* render, GLenum internalFormat,
GLuint width, GLuint height)
{
CALLED();
render->Data = NULL;
render->Width = width;
render->Height = height;
render->RowStride = width;
return GL_TRUE;
}
GLboolean
MesaSoftwareRenderer::_BackRenderbufferStorage(gl_context* ctx,
struct gl_renderbuffer* render, GLenum internalFormat,
GLuint width, GLuint height)
{
CALLED();
struct msr_renderbuffer* mrb = msr_renderbuffer(render);
free(render->Data);
_FrontRenderbufferStorage(ctx, render, internalFormat, width, height);
if (mrb->size)
ERROR("%s: suspicious malloc of 0 bytes.\n", __func__);
render->Data = malloc(mrb->size);
return GL_TRUE;
}
@@ -642,65 +621,63 @@ MesaSoftwareRenderer::_Flush(gl_context* ctx)
}
struct msr_renderbuffer*
struct swrast_renderbuffer*
MesaSoftwareRenderer::_NewRenderBuffer(bool front)
{
CALLED();
struct msr_renderbuffer *msr
= (struct msr_renderbuffer*)calloc(1, sizeof *msr);
struct swrast_renderbuffer *swRenderBuffer
= (struct swrast_renderbuffer*)calloc(1, sizeof *swRenderBuffer);
if (!msr) {
if (!swRenderBuffer) {
ERROR("%s: Failed calloc RenderBuffer\n", __func__);
return NULL;
}
_mesa_init_renderbuffer(&msr->base, 0);
_mesa_init_renderbuffer(&swRenderBuffer->Base, 0);
if (_SetupRenderBuffer(msr, fColorSpace) != B_OK) {
free(msr);
//swRenderBuffer->Base.ClassID = OSMESA_RENDERBUFFER_CLASS;
swRenderBuffer->Base.RefCount = 1;
swRenderBuffer->Base.Delete = _RenderBufferDelete;
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
if (_SetupRenderBuffer(&swRenderBuffer->Base, fColorSpace) != B_OK) {
free(swRenderBuffer);
return NULL;
}
if (front)
msr->base.AllocStorage = _FrontRenderbufferStorage;
else {
msr->base.AllocStorage = _BackRenderbufferStorage;
msr->base.Delete = _DeleteBackBuffer;
}
return msr;
return swRenderBuffer;
}
status_t
MesaSoftwareRenderer::_SetupRenderBuffer(
struct msr_renderbuffer* buffer, color_space colorSpace)
MesaSoftwareRenderer::_SetupRenderBuffer(struct gl_renderbuffer* rb,
color_space colorSpace)
{
CALLED();
buffer->base.DataType = GL_UNSIGNED_BYTE;
buffer->base.Data = NULL;
//buffer->DataType = GL_UNSIGNED_BYTE;
rb->InternalFormat = GL_RGBA;
switch (colorSpace) {
case B_RGBA32:
buffer->base._BaseFormat = GL_RGBA;
buffer->base.Format = MESA_FORMAT_ARGB8888;
rb->_BaseFormat = GL_RGBA;
rb->Format = MESA_FORMAT_ARGB8888;
break;
case B_RGB32:
buffer->base._BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_XRGB8888;
rb->_BaseFormat = GL_RGB;
rb->Format = MESA_FORMAT_XRGB8888;
break;
case B_RGB24:
buffer->base._BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_RGB888;
rb->_BaseFormat = GL_RGB;
rb->Format = MESA_FORMAT_RGB888;
break;
case B_RGB16:
buffer->base._BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_RGB565;
rb->_BaseFormat = GL_RGB;
rb->Format = MESA_FORMAT_RGB565;
break;
case B_RGB15:
buffer->base._BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_ARGB1555;
rb->_BaseFormat = GL_RGB;
rb->Format = MESA_FORMAT_ARGB1555;
break;
default:
fprintf(stderr, "Unsupported screen color space %s\n",
@@ -713,10 +690,9 @@ MesaSoftwareRenderer::_SetupRenderBuffer(
void
MesaSoftwareRenderer::_DeleteBackBuffer(struct gl_renderbuffer* rb)
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
{
CALLED();
free(rb->Data);
free(rb);
}
@@ -23,35 +23,7 @@ extern "C" {
#include "context.h"
#include "main/version.h"
#include "swrast/s_chan.h"
struct msr_renderbuffer {
struct gl_renderbuffer base;
uint32 size;
};
static INLINE struct msr_renderbuffer*
msr_renderbuffer(struct gl_renderbuffer* rb)
{
return (struct msr_renderbuffer*)rb;
}
struct msr_framebuffer {
struct gl_framebuffer base;
uint32 width;
uint32 height;
};
static INLINE struct msr_framebuffer*
msr_framebuffer(struct gl_framebuffer* rb)
{
return (struct msr_framebuffer*)rb;
}
#include "swrast/s_context.h"
}
@@ -71,8 +43,6 @@ public:
virtual status_t CopyPixelsIn(BBitmap* source, BPoint dest);
virtual void FrameResized(float width, float height);
GLvoid** GetRows() { return fRowAddr; }
virtual void EnableDirectMode(bool enabled);
virtual void DirectConnected(direct_buffer_info* info);
@@ -84,20 +54,18 @@ private:
void _CheckResize();
static void _UpdateState(gl_context* ctx, GLuint newState);
static void _ClearFront(gl_context* ctx);
static GLboolean _FrontRenderbufferStorage(gl_context* ctx,
struct gl_renderbuffer* render,
GLenum internalFormat,
GLuint width, GLuint height);
static GLboolean _BackRenderbufferStorage(gl_context* ctx,
struct gl_renderbuffer* render,
GLenum internalFormat,
GLuint width, GLuint height);
static void _Flush(gl_context *ctx);
static void _Flush(gl_context *ctx);
struct msr_renderbuffer* _NewRenderBuffer(bool front);
status_t _SetupRenderBuffer(struct msr_renderbuffer*
buffer, color_space colorSpace);
static void _DeleteBackBuffer(struct gl_renderbuffer* rb);
struct swrast_renderbuffer* _NewRenderBuffer(bool front);
status_t _SetupRenderBuffer(struct gl_renderbuffer* rb,
color_space colorSpace);
/* Mesa callbacks */
static void _RenderBufferDelete(struct gl_renderbuffer* rb);
static GLboolean _RenderBufferStorage(gl_context* ctx,
struct gl_renderbuffer* render,
GLenum internalFormat,
GLuint width, GLuint height);
void _AllocateBitmap();
void _CopyToDirect();
@@ -110,9 +78,10 @@ private:
gl_context* fContext;
gl_config* fVisual;
struct msr_framebuffer* fFrameBuffer;
struct msr_renderbuffer* fFrontRenderBuffer;
struct msr_renderbuffer* fBackRenderBuffer;
struct gl_framebuffer* fFrameBuffer;
struct swrast_renderbuffer* fFrontRenderBuffer;
struct swrast_renderbuffer* fBackRenderBuffer;
GLchan fClearColor[4]; // buffer clear color
GLuint fClearIndex; // buffer clear color index
@@ -120,7 +89,7 @@ private:
GLuint fHeight, fNewHeight;
color_space fColorSpace;
GLvoid* fRowAddr[MAX_HEIGHT];
//GLvoid* fRowAddr[MAX_HEIGHT];
// address of first pixel in each image row
};