SoftPipeRenderer::SoftPipeRenderer(BGLView *view, ulong options, BGLDispatcher* dispatcher) : BGLRenderer(view, options, dispatcher), fBitmap(NULL), fDirectModeEnabled(false), fInfo(NULL), fInfoLocker("info locker"), fOptions(options), fColorSpace(B_NO_COLOR_SPACE) { CALLED(); time_t beg, end; beg = time(NULL); hsp_init(options); end = time(NULL); TRACE("hsp_init time: %f.\n", difftime(end, beg)); BRect b = GLView()->Bounds(); fColorSpace = B_RGBA32; if (fDirectModeEnabled && fInfo != NULL) { fColorSpace = BScreen(GLView()->Window()).ColorSpace(); } int32 width = b.IntegerWidth();// + 1; int32 height = b.IntegerHeight();// + 1; TRACE("ColorSpace:\t%s\n", color_space_name(fColorSpace)); fBitmap = new BBitmap(BRect(0.f, 0.f, width /*- 1*/, height /*- 1*/), fColorSpace); fWidth = width; fHeight = height; beg = time(NULL); fContext = hsp_create_layer_context(fBitmap, 0); TRACE("context:\t%d\n", (int)fContext); end = time(NULL); TRACE("hsp_create_layer_context time: %f.\n", difftime(end, beg)); if (!hsp_get_current_context()) LockGL(); }
void MesaSoftwareRenderer::SwapBuffers(bool VSync) { CALLED(); if (!fBitmap) return; if (fVisual->doubleBufferMode) _mesa_notifySwapBuffers(fContext); if (!fDirectModeEnabled || fInfo == NULL) { if (GLView()->LockLooperWithTimeout(1000) == B_OK) { GLView()->DrawBitmap(fBitmap, B_ORIGIN); GLView()->UnlockLooper(); } } else { // TODO: Here the BGLView needs to be drawlocked. _CopyToDirect(); } if (VSync) { BScreen screen(GLView()->Window()); screen.WaitForRetrace(); } }
void SoftPipeRenderer::SwapBuffers(bool vsync) { // CALLED(); hsp_swap_buffers(fContext); if (!fDirectModeEnabled || fInfo == NULL) { GLView()->LockLooper(); GLView()->DrawBitmap(fBitmap); GLView()->UnlockLooper(); } else { BAutolock lock(fInfoLocker); uint8 bytesPerPixel = fInfo->bits_per_pixel / 8; uint32 bytesPerRow = fBitmap->BytesPerRow(); for (uint32 i = 0; i < fInfo->clip_list_count; i++) { clipping_rect *clip = &fInfo->clip_list[i]; int32 height = clip->bottom - clip->top + 1; int32 bytesWidth = (clip->right - clip->left + 1) * bytesPerPixel; uint8 *p = (uint8 *)fInfo->bits + clip->top * fInfo->bytes_per_row + clip->left * bytesPerPixel; uint8 *b = (uint8 *)fBitmap->Bits() + (clip->top - fInfo->window_bounds.top) * bytesPerRow + (clip->left - fInfo->window_bounds.left) * bytesPerPixel; for (int y = 0; y < height; y++) { memcpy(p, b, bytesWidth); p += fInfo->bytes_per_row; b += bytesPerRow; } } } }
void IntelRenderer::SwapBuffers(bool vsync) { // CALLED(); if (!fBitmap) return; BScreen screen(GLView()->Window()); fContextObj->SwapBuffers(fContextID); BAutolock lock(fInfoLocker); if (!fDirectModeEnabled || fInfo == NULL) { if (GLView()->LockLooperWithTimeout(1000) == B_OK) { GLView()->DrawBitmap(fBitmap, B_ORIGIN); GLView()->UnlockLooper(); if (vsync) screen.WaitForRetrace(); } return; } // check the bitmap size still matches the size if (fInfo->window_bounds.bottom - fInfo->window_bounds.top != fBitmap->Bounds().IntegerHeight() || fInfo->window_bounds.right - fInfo->window_bounds.left != fBitmap->Bounds().IntegerWidth()) { ERROR("%s: Bitmap size doesn't match size!\n", __func__); return; } uint32 bytesPerRow = fBitmap->BytesPerRow(); uint8 bytesPerPixel = bytesPerRow / fBitmap->Bounds().IntegerWidth(); for (uint32 i = 0; i < fInfo->clip_list_count; i++) { clipping_rect *clip = &fInfo->clip_list[i]; int32 height = clip->bottom - clip->top + 1; int32 bytesWidth = (clip->right - clip->left + 1) * bytesPerPixel; bytesWidth -= bytesPerPixel; uint8 *p = (uint8 *)fInfo->bits + clip->top * fInfo->bytes_per_row + clip->left * bytesPerPixel; uint8 *b = (uint8 *)fBitmap->Bits() + (clip->top - fInfo->window_bounds.top) * bytesPerRow + (clip->left - fInfo->window_bounds.left) * bytesPerPixel; for (int y = 0; y < height - 1; y++) { memcpy(p, b, bytesWidth); p += fInfo->bytes_per_row; b += bytesPerRow; } } if (vsync) screen.WaitForRetrace(); }
void MesaSoftwareRenderer::SwapBuffers(bool VSync) { CALLED(); if (!fBitmap) return; if (fVisual->doubleBufferMode) _mesa_notifySwapBuffers(fContext); if (!fDirectModeEnabled || fInfo == NULL) { if (GLView()->LockLooperWithTimeout(1000) == B_OK) { GLView()->DrawBitmap(fBitmap, B_ORIGIN); GLView()->UnlockLooper(); } return; } BAutolock lock(fInfoLocker); // check the bitmap size still matches the size if (fInfo->window_bounds.bottom - fInfo->window_bounds.top != fBitmap->Bounds().IntegerHeight() || fInfo->window_bounds.right - fInfo->window_bounds.left != fBitmap->Bounds().IntegerWidth()) return; uint8 bytesPerPixel = fInfo->bits_per_pixel / 8; uint32 bytesPerRow = fBitmap->BytesPerRow(); for (uint32 i = 0; i < fInfo->clip_list_count; i++) { clipping_rect *clip = &fInfo->clip_list[i]; int32 height = clip->bottom - clip->top + 1; int32 bytesWidth = (clip->right - clip->left + 1) * bytesPerPixel; uint8 *p = (uint8 *)fInfo->bits + clip->top * fInfo->bytes_per_row + clip->left * bytesPerPixel; uint8 *b = (uint8 *)fBitmap->Bits() + (clip->top - fInfo->window_bounds.top) * bytesPerRow + (clip->left - fInfo->window_bounds.left) * bytesPerPixel; for (int y = 0; y < height; y++) { memcpy(p, b, bytesWidth); p += fInfo->bytes_per_row; b += bytesPerRow; } } if (VSync) { BScreen screen(GLView()->Window()); screen.WaitForRetrace(); } }
void IntelRenderer::Draw(BRect updateRect) { // CALLED(); if ((!fDirectModeEnabled || fInfo == NULL) && fBitmap) GLView()->DrawBitmap(fBitmap, updateRect, updateRect); }
void IntelRenderer::LockGL() { // CALLED(); BGLRenderer::LockGL(); color_space cs = BScreen(GLView()->Window()).ColorSpace(); BAutolock lock(fInfoLocker); if (fDirectModeEnabled && fInfo != NULL) { fNewWidth = fInfo->window_bounds.right - fInfo->window_bounds.left; fNewHeight = fInfo->window_bounds.bottom - fInfo->window_bounds.top; } if (fBitmap && cs == fColorSpace && fNewWidth == fWidth && fNewHeight == fHeight) { fContextObj->SetCurrentContext(fBitmap, fContextID); return; } fColorSpace = cs; fWidth = fNewWidth; fHeight = fNewHeight; _AllocateBitmap(); fContextObj->SetCurrentContext(fBitmap, fContextID); }
void MesaSoftwareRenderer::Draw(BRect updateRect) { CALLED(); if (fBitmap && (!fDirectModeEnabled || (fInfo == NULL))) GLView()->DrawBitmap(fBitmap, updateRect, updateRect); }
void MesaSoftwareRenderer::LockGL() { CALLED(); BGLRenderer::LockGL(); _mesa_make_current(fContext, &fFrameBuffer->base, &fFrameBuffer->base); color_space colorSpace = BScreen(GLView()->Window()).ColorSpace(); BAutolock lock(fInfoLocker); if (fDirectModeEnabled && fInfo != NULL) { fNewWidth = fInfo->window_bounds.right - fInfo->window_bounds.left + 1; fNewHeight = fInfo->window_bounds.bottom - fInfo->window_bounds.top + 1; } if (fColorSpace != colorSpace) { fColorSpace = colorSpace; _SetupRenderBuffer(fFrontRenderBuffer, fColorSpace); if (fVisual->doubleBufferMode) _SetupRenderBuffer(fBackRenderBuffer, fColorSpace); } if (fBitmap && fNewWidth == fWidth && fNewHeight == fHeight) return; fWidth = fNewWidth; fHeight = fNewHeight; _AllocateBitmap(); }
void MesaSoftwareRenderer::LockGL() { CALLED(); BGLRenderer::LockGL(); _mesa_make_current(fContext, &fFrameBuffer->Base, &fFrameBuffer->Base); color_space cs = B_RGBA32; BAutolock lock(fInfoLocker); if (fDirectModeEnabled && fInfo != NULL) { cs = BScreen(GLView()->Window()).ColorSpace(); fNewWidth = fInfo->window_bounds.right - fInfo->window_bounds.left + 1; fNewHeight = fInfo->window_bounds.bottom - fInfo->window_bounds.top + 1; } if (fBitmap && cs == fColorSpace && fNewWidth == fWidth && fNewHeight == fHeight) return; if (cs != fColorSpace) { fColorSpace = cs; _SetSpanFuncs(fFrontRenderBuffer, fColorSpace); _SetSpanFuncs(fBackRenderBuffer, fColorSpace); } fWidth = fNewWidth; fHeight = fNewHeight; _AllocateBitmap(); }
void SoftPipeRenderer::Draw(BRect updateRect) { CALLED(); if (!fDirectModeEnabled || fInfo == NULL) GLView()->DrawBitmap(fBitmap, updateRect, updateRect); }
MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, BGLDispatcher* dispatcher) : BGLRenderer(view, options, dispatcher), fBitmap(NULL), fDirectModeEnabled(false), fInfo(NULL), fInfoLocker("info locker"), fContext(NULL), fVisual(NULL), fFrameBuffer(NULL), fFrontRenderBuffer(NULL), fBackRenderBuffer(NULL), fColorSpace(B_NO_COLOR_SPACE) { CALLED(); fClearColor[BE_RCOMP] = 0; fClearColor[BE_GCOMP] = 0; fClearColor[BE_BCOMP] = 0; fClearColor[BE_ACOMP] = 0; fClearIndex = 0; fColorSpace = BScreen(GLView()->Window()).ColorSpace(); // We force single buffering for the time being options &= ~BGL_DOUBLE; const GLboolean rgbFlag = ((options & BGL_INDEX) == 0); const GLboolean alphaFlag = ((options & BGL_ALPHA) == BGL_ALPHA); const GLboolean dblFlag = ((options & BGL_DOUBLE) == BGL_DOUBLE); const GLboolean stereoFlag = false; const GLint depth = (options & BGL_DEPTH) ? 16 : 0; const GLint stencil = (options & BGL_STENCIL) ? 8 : 0; const GLint accum = (options & BGL_ACCUM) ? 16 : 0; const GLint red = rgbFlag ? 8 : 0; const GLint green = rgbFlag ? 8 : 0; const GLint blue = rgbFlag ? 8 : 0; const GLint alpha = alphaFlag ? 8 : 0; fOptions = options; // | BGL_INDIRECT; struct dd_function_table functions; fVisual = _mesa_create_visual(dblFlag, stereoFlag, red, green, blue, alpha, depth, stencil, accum, accum, accum, alpha ? accum : 0, 1); // Initialize device driver function table _mesa_init_driver_functions(&functions); functions.GetString = _GetString; functions.UpdateState = _UpdateState; functions.GetBufferSize = NULL; functions.Error = _Error; functions.Viewport = _Viewport; functions.Flush = _Flush; // create core context #if HAIKU_MESA_VER <= 708 fContext = _mesa_create_context(fVisual, NULL, &functions, this); #else fContext = _mesa_create_context(API_OPENGL, fVisual, NULL, &functions, this); #endif if (!fContext) { ERROR("%s: Failed to create Mesa context!\n", __func__); _mesa_destroy_visual(fVisual); return; } /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(fContext); _vbo_CreateContext(fContext); _tnl_CreateContext(fContext); _swsetup_CreateContext(fContext); _swsetup_Wakeup(fContext); // Use default TCL pipeline TNL_CONTEXT(fContext)->Driver.RunPipeline = _tnl_run_pipeline; _mesa_meta_init(fContext); _mesa_enable_sw_extensions(fContext); _mesa_enable_1_3_extensions(fContext); _mesa_enable_1_4_extensions(fContext); _mesa_enable_1_5_extensions(fContext); _mesa_enable_2_0_extensions(fContext); _mesa_enable_2_1_extensions(fContext); // create core framebuffer fFrameBuffer = (struct msr_framebuffer*)calloc(1, sizeof(*fFrameBuffer)); 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); if (fFrontRenderBuffer == NULL) { ERROR("%s: FrontRenderBuffer is requested but unallocated!\n", __func__); _mesa_destroy_visual(fVisual); free(fFrameBuffer); return; } _mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_FRONT_LEFT, &fFrontRenderBuffer->base); // Setup back render buffer (if requested) if (fVisual->doubleBufferMode) { fBackRenderBuffer = _NewRenderBuffer(false); if (fBackRenderBuffer == NULL) { ERROR("%s: BackRenderBuffer is requested but unallocated!\n", __func__); _mesa_destroy_visual(fVisual); free(fFrameBuffer); return; } _mesa_add_renderbuffer(&fFrameBuffer->base, BUFFER_BACK_LEFT, &fBackRenderBuffer->base); } #if HAIKU_MESA_VER >= 709 // New Mesa _swrast_add_soft_renderbuffers(&fFrameBuffer->base, GL_FALSE, fVisual->haveDepthBuffer, fVisual->haveStencilBuffer, fVisual->haveAccumBuffer, alphaFlag, GL_FALSE); #else // Old Mesa _mesa_add_soft_renderbuffers(&fFrameBuffer->base, GL_FALSE, fVisual->haveDepthBuffer, fVisual->haveStencilBuffer, fVisual->haveAccumBuffer, alphaFlag, GL_FALSE); #endif BRect bounds = view->Bounds(); fWidth = fNewWidth = (GLint)bounds.Width(); fHeight = fNewHeight = (GLint)bounds.Height(); // some stupid applications (Quake2) don't even think about calling LockGL() // before using glGetString and its glGet*() friends... // so make sure there is at least a valid context. if (!_mesa_get_current_context()) { LockGL(); // not needed, we don't have a looper yet: UnlockLooper(); } }
MesaSoftwareRenderer::MesaSoftwareRenderer(BGLView* view, ulong options, BGLDispatcher* dispatcher) : BGLRenderer(view, options, dispatcher), fBitmap(NULL), fDirectModeEnabled(false), fInfo(NULL), fInfoLocker("info locker"), fContext(NULL), fVisual(NULL), fFrameBuffer(NULL), fFrontRenderBuffer(NULL), fBackRenderBuffer(NULL), fColorSpace(B_NO_COLOR_SPACE) { CALLED(); fClearColor[BE_RCOMP] = 0; fClearColor[BE_GCOMP] = 0; fClearColor[BE_BCOMP] = 0; fClearColor[BE_ACOMP] = 0; fClearIndex = 0; fColorSpace = BScreen(GLView()->Window()).ColorSpace(); // We force single buffering for the time being //options &= !BGL_DOUBLE; const GLboolean rgbFlag = ((options & BGL_INDEX) == 0); const GLboolean alphaFlag = ((options & BGL_ALPHA) == BGL_ALPHA); const GLboolean dblFlag = ((options & BGL_DOUBLE) == BGL_DOUBLE); const GLboolean stereoFlag = false; const GLint depth = (options & BGL_DEPTH) ? 16 : 0; const GLint stencil = (options & BGL_STENCIL) ? 8 : 0; const GLint accum = (options & BGL_ACCUM) ? 16 : 0; const GLint index = (options & BGL_INDEX) ? 32 : 0; const GLint red = rgbFlag ? 8 : 0; const GLint green = rgbFlag ? 8 : 0; const GLint blue = rgbFlag ? 8 : 0; const GLint alpha = alphaFlag ? 8 : 0; fOptions = options; // | BGL_INDIRECT; struct dd_function_table functions; fVisual = _mesa_create_visual(rgbFlag, dblFlag, stereoFlag, red, green, blue, alpha, index, depth, stencil, accum, accum, accum, alpha ? accum : 0, 1); // Initialize device driver function table _mesa_init_driver_functions(&functions); functions.GetString = _GetString; functions.UpdateState = _UpdateState; functions.GetBufferSize = NULL; functions.Error = _Error; functions.Viewport = _Viewport; functions.Flush = _Flush; // create core context fContext = _mesa_create_context(fVisual, NULL, &functions, this); if (!fContext) { _mesa_destroy_visual(fVisual); return; } /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(fContext); _vbo_CreateContext(fContext); _tnl_CreateContext(fContext); _swsetup_CreateContext(fContext); _swsetup_Wakeup(fContext); // Use default TCL pipeline TNL_CONTEXT(fContext)->Driver.RunPipeline = _tnl_run_pipeline; _mesa_enable_sw_extensions(fContext); _mesa_enable_1_3_extensions(fContext); _mesa_enable_1_4_extensions(fContext); _mesa_enable_1_5_extensions(fContext); _mesa_enable_2_0_extensions(fContext); _mesa_enable_2_1_extensions(fContext); // create core framebuffer fFrameBuffer = (struct msr_framebuffer*)_mesa_calloc( sizeof(*fFrameBuffer)); _mesa_initialize_framebuffer(&fFrameBuffer->Base, fVisual); fFrontRenderBuffer = (struct msr_renderbuffer*)_mesa_calloc( sizeof(*fFrontRenderBuffer)); _mesa_init_renderbuffer(&fFrontRenderBuffer->Base, 0); fFrontRenderBuffer->Base.AllocStorage = _FrontRenderbufferStorage; fFrontRenderBuffer->Base.Data = NULL; fFrontRenderBuffer->Base.InternalFormat = GL_RGBA; fFrontRenderBuffer->Base._BaseFormat = GL_RGBA; fFrontRenderBuffer->Base.DataType = GL_UNSIGNED_BYTE; fFrontRenderBuffer->Base.RedBits = 8 * sizeof(GLubyte); fFrontRenderBuffer->Base.GreenBits = 8 * sizeof(GLubyte); fFrontRenderBuffer->Base.BlueBits = 8 * sizeof(GLubyte); fFrontRenderBuffer->Base.AlphaBits = 8 * sizeof(GLubyte); _SetSpanFuncs(fFrontRenderBuffer, fColorSpace); _mesa_add_renderbuffer(&fFrameBuffer->Base, BUFFER_FRONT_LEFT, &fFrontRenderBuffer->Base); if (dblFlag) { fBackRenderBuffer = (struct msr_renderbuffer*)_mesa_calloc( sizeof(*fBackRenderBuffer)); _mesa_init_renderbuffer(&fBackRenderBuffer->Base, 0); fBackRenderBuffer->Base.AllocStorage = _BackRenderbufferStorage; fBackRenderBuffer->Base.Data = NULL; fBackRenderBuffer->Base.Delete = _DeleteBackBuffer; fBackRenderBuffer->Base.InternalFormat = GL_RGBA; fBackRenderBuffer->Base._BaseFormat = GL_RGBA; fBackRenderBuffer->Base.DataType = GL_UNSIGNED_BYTE; fBackRenderBuffer->Base.RedBits = 8 * sizeof(GLubyte); fBackRenderBuffer->Base.GreenBits = 8 * sizeof(GLubyte); fBackRenderBuffer->Base.BlueBits = 8 * sizeof(GLubyte); fBackRenderBuffer->Base.AlphaBits = 8 * sizeof(GLubyte); _SetSpanFuncs(fBackRenderBuffer, fColorSpace); _mesa_add_renderbuffer(&fFrameBuffer->Base, BUFFER_BACK_LEFT, &fBackRenderBuffer->Base); } _mesa_add_soft_renderbuffers(&fFrameBuffer->Base, GL_FALSE, fVisual->haveDepthBuffer, fVisual->haveStencilBuffer, fVisual->haveAccumBuffer, alphaFlag, GL_FALSE); BRect bounds = view->Bounds(); fWidth = fNewWidth = (GLint)bounds.Width(); fHeight = fNewHeight = (GLint)bounds.Height(); // some stupid applications (Quake2) don't even think about calling LockGL() // before using glGetString and its glGet*() friends... // so make sure there is at least a valid context. if (!_mesa_get_current_context()) { LockGL(); // not needed, we don't have a looper yet: UnlockLooper(); } }