From 98c974a2c4a783063438a3d461ad6be35ac0f95d Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Tue, 3 Apr 2012 11:24:51 -0500 Subject: [PATCH] swrast: Add allocated renderbuffer option * Double buffering no longer crashes, however it still doesn't function. --- .../opengl/swrast/MesaSoftwareRenderer.cpp | 48 ++++++++++++++++++- .../opengl/swrast/MesaSoftwareRenderer.h | 4 ++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp index 935876bcca..9fad2eebad 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.cpp @@ -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); } diff --git a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h index 3617ad1ac1..3086f537c9 100644 --- a/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h +++ b/src/add-ons/opengl/swrast/MesaSoftwareRenderer.h @@ -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,