swrast: Add allocated renderbuffer option

* Double buffering no longer crashes, however
  it still doesn't function.
This commit is contained in:
Alexander von Gluck IV
2012-04-03 12:00:42 -05:00
parent c6799d8ae1
commit 98c974a2c4
2 changed files with 51 additions and 1 deletions
@@ -516,12 +516,48 @@ MesaSoftwareRenderer::_RenderBufferStorage(gl_context* ctx,
render->Height = height;
struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render);
swRenderBuffer->RowStride = width * _mesa_get_format_bytes(render->Format);
return GL_TRUE;
}
GLboolean
MesaSoftwareRenderer::_RenderBufferStorageMalloc(gl_context* ctx,
struct gl_renderbuffer* render, GLenum internalFormat,
GLuint width, GLuint height)
{
CALLED();
render->Width = width;
render->Height = height;
struct swrast_renderbuffer *swRenderBuffer = swrast_renderbuffer(render);
if (swRenderBuffer != NULL) {
free(swRenderBuffer->Buffer);
swRenderBuffer->RowStride
= width * _mesa_get_format_bytes(render->Format);
uint32 size = swRenderBuffer->RowStride * height;
TRACE("%s: Allocate %" B_PRIu32 " bytes for RenderBuffer\n",
__func__, size);
swRenderBuffer->Buffer = (GLubyte*)malloc(size);
if (!swRenderBuffer->Buffer) {
ERROR("%s: Memory allocation failure!\n", __func__);
return GL_FALSE;
}
} else {
ERROR("%s: Couldn't obtain software renderbuffer!\n",
__func__);
return GL_FALSE;
}
return GL_TRUE;
}
void
MesaSoftwareRenderer::_Flush(gl_context* ctx)
{
@@ -553,7 +589,11 @@ MesaSoftwareRenderer::_NewRenderBuffer(bool front)
swRenderBuffer->Base.ClassID = HAIKU_SWRAST_RENDERBUFFER_CLASS;
swRenderBuffer->Base.RefCount = 1;
swRenderBuffer->Base.Delete = _RenderBufferDelete;
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
if (!front)
swRenderBuffer->Base.AllocStorage = _RenderBufferStorageMalloc;
else
swRenderBuffer->Base.AllocStorage = _RenderBufferStorage;
if (_SetupRenderBuffer(&swRenderBuffer->Base, fColorSpace) != B_OK) {
free(swRenderBuffer);
@@ -633,6 +673,12 @@ void
MesaSoftwareRenderer::_RenderBufferDelete(struct gl_renderbuffer* rb)
{
CALLED();
if (rb != NULL) {
struct swrast_renderbuffer *swRenderBuffer
= swrast_renderbuffer(rb);
if (swRenderBuffer != NULL)
free(swRenderBuffer->Buffer);
}
free(rb);
}
@@ -60,6 +60,10 @@ private:
struct gl_renderbuffer* render,
GLenum internalFormat,
GLuint width, GLuint height);
static GLboolean _RenderBufferStorageMalloc(gl_context* ctx,
struct gl_renderbuffer* render,
GLenum internalFormat,
GLuint width, GLuint height);
static void _RenderBufferMap(gl_context *ctx,
struct gl_renderbuffer *rb,
GLuint x, GLuint y, GLuint w, GLuint h,