hrev43691 adds 1 changeset to branch 'master' old head: 1a4cf8161ea286cb401d31a234cfb7a9c18ac9e4 new head: e887ca27b1ad2de79ea5dc279f28055c4e2c1b5d ---------------------------------------------------------------------------- e887ca2: mesa: Improve and cleanup render code. [ Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev43691 Commit: e887ca27b1ad2de79ea5dc279f28055c4e2c1b5d URL: http://cgit.haiku-os.org/haiku/commit/?id=e887ca2 Author: Alexander von Gluck IV <kallisti5@xxxxxxxxxxx> Date: Tue Jan 24 23:39:12 2012 UTC ---------------------------------------------------------------------------- 2 files changed, 62 insertions(+), 25 deletions(-) .../MesaSoftwareRenderer.cpp | 84 +++++++++++----- .../mesa_software_renderer/MesaSoftwareRenderer.h | 3 +- ---------------------------------------------------------------------------- diff --git a/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.cpp b/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.cpp index 6a3e0c8..5a0d4fc 100644 --- a/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.cpp +++ b/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.cpp @@ -46,7 +46,17 @@ extern "C" { #include "vbo/vbo.h" -#define CALLED() //printf("CALLED %s\n",__PRETTY_FUNCTION__) +#define TRACE_SOFTGL +#ifdef TRACE_SOFTGL +extern "C" void _sPrintf(const char* format, ...); +# define TRACE(x...) _sPrintf("MesaSoftwareRenderer: " x) +# define CALLED() printf("MesaSoftwareRenderer: %s\n", __PRETTY_FUNCTION__) +#else +# define TRACE(x...) +# define CALLED() +#endif + +#define ERROR(x...) _sPrintf("MesaSoftwareRenderer: " x) } @@ -250,6 +260,7 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, #endif if (!fContext) { + ERROR("%s: Failed to create Mesa context!\n", __func__); _mesa_destroy_visual(fVisual); return; } @@ -278,33 +289,23 @@ MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, _mesa_initialize_window_framebuffer(&fFrameBuffer->base, fVisual); // Setup front render buffer - fFrontRenderBuffer = (struct msr_renderbuffer*)calloc(1, - sizeof(*fFrontRenderBuffer)); - _mesa_init_renderbuffer(&fFrontRenderBuffer->base, 0); - fFrontRenderBuffer->active = true; - if (_SetupRenderBuffer(fFrontRenderBuffer, fColorSpace) != B_OK) { - free(fFrameBuffer); + fFrontRenderBuffer = _NewRenderBuffer(true); + if (fFrontRenderBuffer == NULL) { _mesa_destroy_visual(fVisual); return; } - fFrontRenderBuffer->base.AllocStorage = _FrontRenderbufferStorage; _mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT, &fFrontRenderBuffer->base); // Setup back render buffer (if needed) - fBackRenderBuffer = (struct msr_renderbuffer*)calloc(1, - sizeof(*fBackRenderBuffer)); - if (dblFlag) { - _mesa_init_renderbuffer(&fBackRenderBuffer->base, 0); - - fBackRenderBuffer->active = true; - _SetupRenderBuffer(fBackRenderBuffer, fColorSpace); - fBackRenderBuffer->base.AllocStorage = _BackRenderbufferStorage; - fBackRenderBuffer->base.Delete = _DeleteBackBuffer; + if (fVisual->doubleBufferMode) { + fBackRenderBuffer = _NewRenderBuffer(false); + if (fBackRenderBuffer == NULL) { + _mesa_destroy_visual(fVisual); + return; + } _mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT, &fBackRenderBuffer->base); - } else { - fBackRenderBuffer->active = false; } #if HAIKU_MESA_VER >= 709 @@ -372,7 +373,7 @@ MesaSoftwareRenderer::LockGL() if (fColorSpace != colorSpace) { fColorSpace = colorSpace; _SetupRenderBuffer(fFrontRenderBuffer, fColorSpace); - if (fBackRenderBuffer->active) + if (fVisual->doubleBufferMode) _SetupRenderBuffer(fBackRenderBuffer, fColorSpace); } @@ -554,12 +555,15 @@ MesaSoftwareRenderer::FrameResized(float width, float height) void MesaSoftwareRenderer::_AllocateBitmap() { + CALLED(); // allocate new size of back buffer bitmap delete fBitmap; fBitmap = NULL; - if (fWidth < 1 || fHeight < 1) + if (fWidth < 1 || fHeight < 1) { + TRACE("%s: Cannot allocate bitmap < 1x1!\n", __func__); return; + } BRect rect(0.0, 0.0, fWidth - 1, fHeight - 1); fBitmap = new BBitmap(rect, fColorSpace); for (uint i = 0; i < fHeight; i++) { @@ -570,7 +574,7 @@ MesaSoftwareRenderer::_AllocateBitmap() _mesa_resize_framebuffer(fContext, &fFrameBuffer->base, fWidth, fHeight); fFrontRenderBuffer->base.Data = fBitmap->Bits(); fFrontRenderBuffer->size = fBitmap->BitsLength(); - if (fBackRenderBuffer->active) + if (fVisual->doubleBufferMode) fBackRenderBuffer->size = fBitmap->BitsLength(); fFrameBuffer->width = fWidth; fFrameBuffer->height = fHeight; @@ -694,6 +698,8 @@ MesaSoftwareRenderer::_FrontRenderbufferStorage(gl_context* ctx, struct gl_renderbuffer* render, GLenum internalFormat, GLuint width, GLuint height) { + CALLED(); + render->Data = NULL; render->Width = width; render->Height = height; @@ -732,12 +738,41 @@ MesaSoftwareRenderer::_Flush(gl_context* ctx) } +struct msr_renderbuffer* +MesaSoftwareRenderer::_NewRenderBuffer(bool front) +{ + CALLED(); + struct msr_renderbuffer *msr + = (struct msr_renderbuffer*)calloc(1, sizeof *msr); + + if (!msr) { + ERROR("%s: Failed calloc RenderBuffer\n", __func__); + return NULL; + } + + _mesa_init_renderbuffer(&msr->base, 0); + + if (_SetupRenderBuffer(msr, fColorSpace) != B_OK) { + free(msr); + return NULL; + } + + if (front) + msr->base.AllocStorage = _FrontRenderbufferStorage; + else { + msr->base.AllocStorage = _BackRenderbufferStorage; + msr->base.Delete = _DeleteBackBuffer; + } + + return msr; +} + + status_t MesaSoftwareRenderer::_SetupRenderBuffer( struct msr_renderbuffer* buffer, color_space colorSpace) { - if (!buffer->active) - return B_OK; + CALLED(); buffer->base.DataType = GL_UNSIGNED_BYTE; buffer->base.Data = NULL; @@ -831,6 +866,7 @@ MesaSoftwareRenderer::_SetupRenderBuffer( void MesaSoftwareRenderer::_DeleteBackBuffer(struct gl_renderbuffer* rb) { + CALLED(); free(rb->Data); free(rb); } diff --git a/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.h b/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.h index 3f0ca46..f6d8f77 100644 --- a/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.h +++ b/src/add-ons/opengl/mesa_software_renderer/MesaSoftwareRenderer.h @@ -38,7 +38,6 @@ extern "C" { struct msr_renderbuffer { struct gl_renderbuffer base; uint32 size; - bool active; }; @@ -103,6 +102,8 @@ private: GLenum internalFormat, GLuint width, GLuint height); 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);