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