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); _mesa_enable_2_1_extensions(fContext);
// create core framebuffer // create core framebuffer
fFrameBuffer = (struct msr_framebuffer*)calloc(1, fFrameBuffer = _mesa_create_framebuffer(fVisual);
sizeof(*fFrameBuffer));
if (fFrameBuffer == NULL) { if (fFrameBuffer == NULL) {
ERROR("%s: Unable to calloc GL FrameBuffer!\n", __func__); ERROR("%s: Unable to calloc GL FrameBuffer!\n", __func__);
_mesa_destroy_visual(fVisual); _mesa_destroy_visual(fVisual);
return; return;
} }
_mesa_initialize_window_framebuffer(&fFrameBuffer->base, fVisual);
// Setup front render buffer // Setup front render buffer
fFrontRenderBuffer = _NewRenderBuffer(true); fFrontRenderBuffer = _NewRenderBuffer(true);
@@ -187,8 +185,8 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
free(fFrameBuffer); free(fFrameBuffer);
return; return;
} }
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT, _mesa_add_renderbuffer(fFrameBuffer, BUFFER_FRONT_LEFT,
&fFrontRenderBuffer->base); &fFrontRenderBuffer->Base);
// Setup back render buffer (if requested) // Setup back render buffer (if requested)
if (fVisual->doubleBufferMode) { if (fVisual->doubleBufferMode) {
@@ -200,11 +198,11 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options,
free(fFrameBuffer); free(fFrameBuffer);
return; return;
} }
_mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT, _mesa_add_renderbuffer(fFrameBuffer, BUFFER_BACK_LEFT,
&fBackRenderBuffer->base); &fBackRenderBuffer->Base);
} }
_swrast_add_soft_renderbuffers(&fFrameBuffer->base, GL_FALSE, _swrast_add_soft_renderbuffers(fFrameBuffer, GL_FALSE,
fVisual->haveDepthBuffer, fVisual->haveStencilBuffer, fVisual->haveDepthBuffer, fVisual->haveStencilBuffer,
fVisual->haveAccumBuffer, alphaFlag, GL_FALSE); fVisual->haveAccumBuffer, alphaFlag, GL_FALSE);
@@ -231,7 +229,7 @@ MesaSoftwareRenderer::~MesaSoftwareRenderer()
_tnl_DestroyContext(fContext); _tnl_DestroyContext(fContext);
_vbo_DestroyContext(fContext); _vbo_DestroyContext(fContext);
_mesa_destroy_visual(fVisual); _mesa_destroy_visual(fVisual);
_mesa_destroy_framebuffer(&fFrameBuffer->base); _mesa_destroy_framebuffer(fFrameBuffer);
_mesa_destroy_context(fContext); _mesa_destroy_context(fContext);
free(fInfo); free(fInfo);
@@ -247,7 +245,7 @@ MesaSoftwareRenderer::LockGL()
CALLED(); CALLED();
BGLRenderer::LockGL(); BGLRenderer::LockGL();
_mesa_make_current(fContext, &fFrameBuffer->base, &fFrameBuffer->base); _mesa_make_current(fContext, fFrameBuffer, fFrameBuffer);
color_space colorSpace = BScreen(GLView()->Window()).ColorSpace(); color_space colorSpace = BScreen(GLView()->Window()).ColorSpace();
@@ -261,9 +259,9 @@ MesaSoftwareRenderer::LockGL()
if (fColorSpace != colorSpace) { if (fColorSpace != colorSpace) {
fColorSpace = colorSpace; fColorSpace = colorSpace;
_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace); _SetupRenderBuffer(&fFrontRenderBuffer->Base, fColorSpace);
if (fVisual->doubleBufferMode) if (fVisual->doubleBufferMode)
_SetupRenderBuffer(fBackRenderBuffer, fColorSpace); _SetupRenderBuffer(&fBackRenderBuffer->Base, fColorSpace);
} }
_CheckResize(); _CheckResize();
@@ -444,7 +442,7 @@ MesaSoftwareRenderer::_CheckResize()
fHeight = fNewHeight; fHeight = fNewHeight;
fWidth = fNewWidth; fWidth = fNewWidth;
_mesa_resize_framebuffer(fContext, &fFrameBuffer->base, fWidth, fHeight); _mesa_resize_framebuffer(fContext, fFrameBuffer, fWidth, fHeight);
_AllocateBitmap(); _AllocateBitmap();
} }
@@ -465,19 +463,19 @@ 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++) { //for (uint i = 0; i < fHeight; i++) {
fRowAddr[fHeight - i - 1] = (GLvoid *)((GLubyte *)fBitmap->Bits() // fRowAddr[fHeight - i - 1] = (GLvoid *)((GLubyte *)fBitmap->Bits()
+ i * fBitmap->BytesPerRow()); // + i * fBitmap->BytesPerRow());
} //}
fFrontRenderBuffer->size = fBitmap->BitsLength(); //fFrontRenderBuffer->size = fBitmap->BitsLength();
if (fVisual->doubleBufferMode) //if (fVisual->doubleBufferMode)
fBackRenderBuffer->size = fBitmap->BitsLength(); // fBackRenderBuffer->size = fBitmap->BitsLength();
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());
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(); CALLED();
gl_framebuffer* draw = ctx->WinSysDrawBuffer; // TODO
gl_framebuffer* read = ctx->WinSysReadBuffer; //gl_framebuffer* draw = ctx->WinSysDrawBuffer;
struct msr_framebuffer* msr = msr_framebuffer(draw); //gl_framebuffer* read = ctx->WinSysReadBuffer;
_mesa_resize_framebuffer(ctx, draw, msr->width, msr->height); //struct swrast_renderbuffer* msr = haikuFrameBuffer(draw);
_mesa_resize_framebuffer(ctx, read, msr->width, msr->height);
//_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 GLboolean
MesaSoftwareRenderer::_FrontRenderbufferStorage(gl_context* ctx, MesaSoftwareRenderer::_RenderBufferStorage(gl_context* ctx,
struct gl_renderbuffer* render, GLenum internalFormat, struct gl_renderbuffer* render, GLenum internalFormat,
GLuint width, GLuint height) GLuint width, GLuint height)
{ {
CALLED(); CALLED();
render->Data = NULL;
render->Width = width; render->Width = width;
render->Height = height; 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; return GL_TRUE;
} }
@@ -642,65 +621,63 @@ MesaSoftwareRenderer::_Flush(gl_context* ctx)
} }
struct msr_renderbuffer* struct swrast_renderbuffer*
MesaSoftwareRenderer::_NewRenderBuffer(bool front) MesaSoftwareRenderer::_NewRenderBuffer(bool front)
{ {
CALLED(); CALLED();
struct msr_renderbuffer *msr struct swrast_renderbuffer *swRenderBuffer
= (struct msr_renderbuffer*)calloc(1, sizeof *msr); = (struct swrast_renderbuffer*)calloc(1, sizeof *swRenderBuffer);
if (!msr) { if (!swRenderBuffer) {
ERROR("%s: Failed calloc RenderBuffer\n", __func__); ERROR("%s: Failed calloc RenderBuffer\n", __func__);
return NULL; return NULL;
} }
_mesa_init_renderbuffer(&msr->base, 0); _mesa_init_renderbuffer(&swRenderBuffer->Base, 0);
if (_SetupRenderBuffer(msr, fColorSpace) != B_OK) { //swRenderBuffer->Base.ClassID = OSMESA_RENDERBUFFER_CLASS;
free(msr); swRenderBuffer->Base.RefCount = 1;
swRenderBuffer->Base.Delete = _RenderBufferDelete;
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
if (_SetupRenderBuffer(&swRenderBuffer->Base, fColorSpace) != B_OK) {
free(swRenderBuffer);
return NULL; return NULL;
} }
if (front) return swRenderBuffer;
msr->base.AllocStorage = _FrontRenderbufferStorage;
else {
msr->base.AllocStorage = _BackRenderbufferStorage;
msr->base.Delete = _DeleteBackBuffer;
}
return msr;
} }
status_t status_t
MesaSoftwareRenderer::_SetupRenderBuffer( MesaSoftwareRenderer::_SetupRenderBuffer(struct gl_renderbuffer* rb,
struct msr_renderbuffer* buffer, color_space colorSpace) color_space colorSpace)
{ {
CALLED(); CALLED();
buffer->base.DataType = GL_UNSIGNED_BYTE; //buffer->DataType = GL_UNSIGNED_BYTE;
buffer->base.Data = NULL; rb->InternalFormat = GL_RGBA;
switch (colorSpace) { switch (colorSpace) {
case B_RGBA32: case B_RGBA32:
buffer->base._BaseFormat = GL_RGBA; rb->_BaseFormat = GL_RGBA;
buffer->base.Format = MESA_FORMAT_ARGB8888; rb->Format = MESA_FORMAT_ARGB8888;
break; break;
case B_RGB32: case B_RGB32:
buffer->base._BaseFormat = GL_RGB; rb->_BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_XRGB8888; rb->Format = MESA_FORMAT_XRGB8888;
break; break;
case B_RGB24: case B_RGB24:
buffer->base._BaseFormat = GL_RGB; rb->_BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_RGB888; rb->Format = MESA_FORMAT_RGB888;
break; break;
case B_RGB16: case B_RGB16:
buffer->base._BaseFormat = GL_RGB; rb->_BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_RGB565; rb->Format = MESA_FORMAT_RGB565;
break; break;
case B_RGB15: case B_RGB15:
buffer->base._BaseFormat = GL_RGB; rb->_BaseFormat = GL_RGB;
buffer->base.Format = MESA_FORMAT_ARGB1555; rb->Format = MESA_FORMAT_ARGB1555;
break; break;
default: default:
fprintf(stderr, "Unsupported screen color space %s\n", fprintf(stderr, "Unsupported screen color space %s\n",
@@ -713,10 +690,9 @@ MesaSoftwareRenderer::_SetupRenderBuffer(
void void
MesaSoftwareRenderer::_DeleteBackBuffer(struct gl_renderbuffer* rb) MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
{ {
CALLED(); CALLED();
free(rb->Data);
free(rb); free(rb);
} }
@@ -23,35 +23,7 @@ extern "C" {
#include "context.h" #include "context.h"
#include "main/version.h" #include "main/version.h"
#include "swrast/s_chan.h" #include "swrast/s_chan.h"
#include "swrast/s_context.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;
}
} }
@@ -71,8 +43,6 @@ public:
virtual status_t CopyPixelsIn(BBitmap* source, BPoint dest); virtual status_t CopyPixelsIn(BBitmap* source, BPoint dest);
virtual void FrameResized(float width, float height); virtual void FrameResized(float width, float height);
GLvoid** GetRows() { return fRowAddr; }
virtual void EnableDirectMode(bool enabled); virtual void EnableDirectMode(bool enabled);
virtual void DirectConnected(direct_buffer_info* info); virtual void DirectConnected(direct_buffer_info* info);
@@ -84,20 +54,18 @@ private:
void _CheckResize(); void _CheckResize();
static void _UpdateState(gl_context* ctx, GLuint newState); static void _UpdateState(gl_context* ctx, GLuint newState);
static void _ClearFront(gl_context* ctx); static void _ClearFront(gl_context* ctx);
static GLboolean _FrontRenderbufferStorage(gl_context* ctx, static void _Flush(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);
struct msr_renderbuffer* _NewRenderBuffer(bool front); struct swrast_renderbuffer* _NewRenderBuffer(bool front);
status_t _SetupRenderBuffer(struct msr_renderbuffer* status_t _SetupRenderBuffer(struct gl_renderbuffer* rb,
buffer, color_space colorSpace); color_space colorSpace);
static void _DeleteBackBuffer(struct gl_renderbuffer* rb);
/* 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 _AllocateBitmap();
void _CopyToDirect(); void _CopyToDirect();
@@ -110,9 +78,10 @@ private:
gl_context* fContext; gl_context* fContext;
gl_config* fVisual; gl_config* fVisual;
struct msr_framebuffer* fFrameBuffer;
struct msr_renderbuffer* fFrontRenderBuffer; struct gl_framebuffer* fFrameBuffer;
struct msr_renderbuffer* fBackRenderBuffer; struct swrast_renderbuffer* fFrontRenderBuffer;
struct swrast_renderbuffer* fBackRenderBuffer;
GLchan fClearColor[4]; // buffer clear color GLchan fClearColor[4]; // buffer clear color
GLuint fClearIndex; // buffer clear color index GLuint fClearIndex; // buffer clear color index
@@ -120,7 +89,7 @@ private:
GLuint fHeight, fNewHeight; GLuint fHeight, fNewHeight;
color_space fColorSpace; color_space fColorSpace;
GLvoid* fRowAddr[MAX_HEIGHT]; //GLvoid* fRowAddr[MAX_HEIGHT];
// address of first pixel in each image row // address of first pixel in each image row
}; };