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:
@@ -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
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user