Lines Matching defs:pBlitter

285  * @param   pBlitter        The blitter to initialize.
312 * reset by doing CrBltMuralSetCurrentInfo(pBlitter,
322 VBOXBLITTERDECL(int) CrBltInit(PCR_BLITTER pBlitter, const CR_BLITTER_CONTEXT *pCtxBase,
338 RT_ZERO(*pBlitter);
340 pBlitter->pDispatch = pDispatch;
342 pBlitter->CtxInfo = *pCtxBase;
344 pBlitter->Flags.ForceDrawBlit = fForceDrawBlt;
350 pBlitter->CtxInfo.Base.id = 0;
352 pBlitter->CtxInfo.Base.id = pDispatch->CreateContext("", pCtxBase->Base.visualBits, pCtxBase->Base.id);
354 if (!pBlitter->CtxInfo.Base.id)
356 RT_ZERO(*pBlitter);
360 pBlitter->Flags.CtxCreated = 1;
365 pBlitter->pGlslCache = pShaders;
366 pBlitter->Flags.ShadersGloal = 1;
370 CrGlslInit(&pBlitter->LocalGlslCache, pDispatch);
371 pBlitter->pGlslCache = &pBlitter->LocalGlslCache;
377 VBOXBLITTERDECL(int) CrBltCleanup(PCR_BLITTER pBlitter)
379 if (CrBltIsEntered(pBlitter))
385 if (pBlitter->Flags.ShadersGloal || !CrGlslNeedsCleanup(&pBlitter->LocalGlslCache))
388 int rc = CrBltEnter(pBlitter);
395 CrGlslCleanup(&pBlitter->LocalGlslCache);
397 CrBltLeave(pBlitter);
402 void CrBltTerm(PCR_BLITTER pBlitter)
407 if (pBlitter->Flags.CtxCreated)
408 pBlitter->pDispatch->DestroyContext(pBlitter->CtxInfo.Base.id);
410 memset(pBlitter, 0, sizeof (*pBlitter));
413 int CrBltMuralSetCurrentInfo(PCR_BLITTER pBlitter, const CR_BLITTER_WINDOW *pMural)
417 if (!memcmp(&pBlitter->CurrentMural, pMural, sizeof (pBlitter->CurrentMural)))
419 memcpy(&pBlitter->CurrentMural, pMural, sizeof (pBlitter->CurrentMural));
423 if (CrBltIsEntered(pBlitter))
428 if (!pBlitter->CurrentMural.Base.id)
430 pBlitter->CurrentMural.Base.id = 0;
433 pBlitter->Flags.CurrentMuralChanged = 1;
435 if (!CrBltIsEntered(pBlitter))
438 if (!pBlitter->CtxInfo.Base.id)
449 pBlitter->pDispatch->Flush();
451 pBlitter->pDispatch->MakeCurrent(pMural->Base.id, pBlitter->i32MakeCurrentUserData, pBlitter->CtxInfo.Base.id);
460 static DECLCALLBACK(int) crBltBlitTexBufImplFbo(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, const RTRECT *paSrcRect, const RTRECTSIZE *pDstSize, const RTRECT *paDstRect, uint32_t cRects, uint32_t fFlags)
463 pBlitter->pDispatch->BindFramebufferEXT(GL_READ_FRAMEBUFFER, pBlitter->idFBO);
464 pBlitter->pDispatch->FramebufferTexture2DEXT(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, pSrc->target, pSrc->hwid, 0);
465 pBlitter->pDispatch->ReadBuffer(GL_COLOR_ATTACHMENT0);
530 pBlitter->pDispatch->BlitFramebufferEXT(srcX1, srcY1, srcX2, srcY2,
691 static void crBltCheckSetupViewport(PCR_BLITTER pBlitter, const RTRECTSIZE *pDstSize, bool fFBODraw)
693 bool fUpdateViewport = pBlitter->Flags.CurrentMuralChanged;
694 if ( pBlitter->CurrentSetSize.cx != pDstSize->cx
695 || pBlitter->CurrentSetSize.cy != pDstSize->cy)
697 pBlitter->CurrentSetSize = *pDstSize;
701 pBlitter->pDispatch->MatrixMode(GL_PROJECTION);
702 pBlitter->pDispatch->LoadIdentity();
703 pBlitter->pDispatch->Ortho(0, pDstSize->cx, 0, pDstSize->cy, -1, 1);
713 pBlitter->pDispatch->Viewport(0, 0, pBlitter->CurrentSetSize.cx, pBlitter->CurrentSetSize.cy);
715 pBlitter->Flags.CurrentMuralChanged = 0;
718 pBlitter->Flags.LastWasFBODraw = fFBODraw;
724 static DECLCALLBACK(int) crBltBlitTexBufImplDraw2D(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, const RTRECT *paSrcRect, const RTRECTSIZE *pDstSize, const RTRECT *paDstRect, uint32_t cRects, uint32_t fFlags)
755 pBlitter->pDispatch->BindTexture(pSrc->target, pSrc->hwid);
764 pVerticies = (GLfloat*)crBltBufGet(&pBlitter->Verticies, cElements * 2 * 2 * sizeof (*pVerticies));
768 pBlitter->pDispatch->EnableClientState(GL_VERTEX_ARRAY);
769 pBlitter->pDispatch->VertexPointer(2, GL_FLOAT, 0, pVerticies);
771 pBlitter->pDispatch->EnableClientState(GL_TEXTURE_COORD_ARRAY);
772 pBlitter->pDispatch->TexCoordPointer(2, GL_FLOAT, 0, pTexCoords);
774 pBlitter->pDispatch->Enable(pSrc->target);
776 pBlitter->pDispatch->DrawArrays(GL_TRIANGLE_FAN, 0, cElements);
778 pBlitter->pDispatch->Disable(pSrc->target);
780 pBlitter->pDispatch->DisableClientState(GL_TEXTURE_COORD_ARRAY);
781 pBlitter->pDispatch->DisableClientState(GL_VERTEX_ARRAY);
792 pVerticies = (GLfloat*)crBltBufGet(&pBlitter->Verticies, cElements * 2 * 2 * sizeof (*pVerticies) + cIndicies * sizeof (*pIndicies));
796 pBlitter->pDispatch->EnableClientState(GL_VERTEX_ARRAY);
797 pBlitter->pDispatch->VertexPointer(2, GL_FLOAT, 0, pVerticies);
799 pBlitter->pDispatch->EnableClientState(GL_TEXTURE_COORD_ARRAY);
800 pBlitter->pDispatch->TexCoordPointer(2, GL_FLOAT, 0, pTexCoords);
802 pBlitter->pDispatch->Enable(pSrc->target);
804 pBlitter->pDispatch->DrawElements(GL_TRIANGLES, cIndicies, GL_UNSIGNED_BYTE, pIndicies);
806 pBlitter->pDispatch->Disable(pSrc->target);
808 pBlitter->pDispatch->DisableClientState(GL_TEXTURE_COORD_ARRAY);
809 pBlitter->pDispatch->DisableClientState(GL_VERTEX_ARRAY);
812 pBlitter->pDispatch->BindTexture(pSrc->target, 0);
817 static int crBltInitOnMakeCurent(PCR_BLITTER pBlitter)
819 const char * pszExtension = (const char*)pBlitter->pDispatch->GetString(GL_EXTENSIONS);
822 pBlitter->Flags.SupportsFBO = 1;
823 pBlitter->pDispatch->GenFramebuffersEXT(1, &pBlitter->idFBO);
824 Assert(pBlitter->idFBO);
830 pBlitter->Flags.SupportsPBO = 1;
836 if (!pBlitter->Flags.ForceDrawBlit && crStrstr(pszExtension, "GL_EXT_framebuffer_blit"))
838 pBlitter->pfnBlt = crBltBlitTexBufImplFbo;
843 pBlitter->pfnBlt = crBltBlitTexBufImplDraw2D;
847 pBlitter->pDispatch->MatrixMode(GL_TEXTURE);
848 pBlitter->pDispatch->LoadIdentity();
849 pBlitter->pDispatch->MatrixMode(GL_MODELVIEW);
850 pBlitter->pDispatch->LoadIdentity();
858 void CrBltLeave(PCR_BLITTER pBlitter)
860 if (!pBlitter->cEnters)
866 if (--pBlitter->cEnters)
872 if (pBlitter->Flags.SupportsFBO)
874 pBlitter->pDispatch->BindFramebufferEXT(GL_FRAMEBUFFER, 0);
875 pBlitter->pDispatch->DrawBuffer(GL_BACK);
876 pBlitter->pDispatch->ReadBuffer(GL_BACK);
879 pBlitter->pDispatch->Flush();
881 if (pBlitter->CtxInfo.Base.id)
882 pBlitter->pDispatch->MakeCurrent(0, 0, 0);
886 int CrBltEnter(PCR_BLITTER pBlitter)
888 if (!pBlitter->CurrentMural.Base.id && pBlitter->CtxInfo.Base.id)
894 if (pBlitter->cEnters++)
897 if (pBlitter->CurrentMural.Base.id) /* <- pBlitter->CurrentMural.Base.id can be null if the blitter is in a "no-context" mode (see comments to BltInit for detail)*/
902 pBlitter->pDispatch->MakeCurrent(pBlitter->CurrentMural.Base.id, pBlitter->i32MakeCurrentUserData, pBlitter->CtxInfo.Base.id);
906 if (pBlitter->Flags.Initialized)
913 int rc = crBltInitOnMakeCurent(pBlitter);
917 pBlitter->Flags.Initialized = 1;
922 CrBltLeave(pBlitter);
927 static void crBltBlitTexBuf(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, const RTRECT *paSrcRects, GLenum enmDstBuff, const RTRECTSIZE *pDstSize, const RTRECT *paDstRects, uint32_t cRects, uint32_t fFlags)
932 pBlitter->pDispatch->DrawBuffer(enmDstBuff);
934 crBltCheckSetupViewport(pBlitter, pDstSize, enmDstBuff == GL_DRAW_FRAMEBUFFER);
937 pBlitter->pfnBlt(pBlitter, pSrc, paSrcRects, pDstSize, paDstRects, cRects, fFlags);
940 int rc = pBlitter->Flags.ShadersGloal
941 ? CrGlslProgUseNoAlpha(pBlitter->pGlslCache, pSrc->target)
942 : CrGlslProgUseGenNoAlpha(&pBlitter->LocalGlslCache, pSrc->target);
947 pBlitter->pfnBlt(pBlitter, pSrc, paSrcRects, pDstSize, paDstRects, cRects, fFlags);
953 crBltBlitTexBufImplDraw2D(pBlitter, pSrc, paSrcRects, pDstSize, paDstRects, cRects, fFlags);
955 Assert(pBlitter->Flags.ShadersGloal || &pBlitter->LocalGlslCache == pBlitter->pGlslCache);
957 CrGlslProgClear(pBlitter->pGlslCache);
962 void CrBltCheckUpdateViewport(PCR_BLITTER pBlitter)
964 RTRECTSIZE DstSize = {pBlitter->CurrentMural.width, pBlitter->CurrentMural.height};
965 crBltCheckSetupViewport(pBlitter, &DstSize, false);
968 void CrBltBlitTexMural(PCR_BLITTER pBlitter, bool fBb, const VBOXVR_TEXTURE *pSrc, const RTRECT *paSrcRects, const RTRECT *paDstRects, uint32_t cRects, uint32_t fFlags)
970 if (!CrBltIsEntered(pBlitter))
976 RTRECTSIZE DstSize = {pBlitter->CurrentMural.width, pBlitter->CurrentMural.height};
981 pBlitter->pDispatch->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
984 crBltBlitTexBuf(pBlitter, pSrc, paSrcRects, fBb ? GL_BACK : GL_FRONT, &DstSize, paDstRects, cRects, fFlags);
990 void CrBltBlitTexTex(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, const RTRECT *pSrcRect, const VBOXVR_TEXTURE *pDst, const RTRECT *pDstRect, uint32_t cRects, uint32_t fFlags)
992 if (!CrBltIsEntered(pBlitter))
1000 pBlitter->pDispatch->BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, pBlitter->idFBO);
1004 pBlitter->pDispatch->FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, pDst->target, pDst->hwid, 0);
1006 // pBlitter->pDispatch->FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
1007 // pBlitter->pDispatch->FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
1009 crBltBlitTexBuf(pBlitter, pSrc, pSrcRect, GL_DRAW_FRAMEBUFFER, &DstSize, pDstRect, cRects, fFlags);
1011 pBlitter->pDispatch->FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, pDst->target, 0, 0);
1014 void CrBltPresent(PCR_BLITTER pBlitter)
1016 if (!CrBltIsEntered(pBlitter))
1022 if (pBlitter->CtxInfo.Base.visualBits & CR_DOUBLE_BIT)
1023 pBlitter->pDispatch->SwapBuffers(pBlitter->CurrentMural.Base.id, 0);
1025 pBlitter->pDispatch->Flush();
1080 VBOXBLITTERDECL(int) CrBltImgGetTex(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, GLenum enmFormat, CR_BLITTER_IMG *pDst)
1082 if (!CrBltIsEntered(pBlitter))
1094 pBlitter->pDispatch->BindTexture(pSrc->target, pSrc->hwid);
1099 pBlitter->pDispatch->GetTexLevelParameteriv(pSrc->target, 0, GL_TEXTURE_WIDTH, &width);
1100 pBlitter->pDispatch->GetTexLevelParameteriv(pSrc->target, 0, GL_TEXTURE_HEIGHT, &height);
1101 pBlitter->pDispatch->GetTexLevelParameteriv(pSrc->target, 0, GL_TEXTURE_DEPTH, &depth);
1109 pBlitter->pDispatch->GetTexImage(pSrc->target, 0, enmFormat, GL_UNSIGNED_BYTE, pDst->pvData);
1111 pBlitter->pDispatch->BindTexture(pSrc->target, 0);
1115 VBOXBLITTERDECL(int) CrBltImgGetMural(PCR_BLITTER pBlitter, bool fBb, CR_BLITTER_IMG *pDst)
1117 if (!CrBltIsEntered(pBlitter))
1127 VBOXBLITTERDECL(void) CrBltImgFree(PCR_BLITTER pBlitter, CR_BLITTER_IMG *pDst)
1129 if (!CrBltIsEntered(pBlitter))
1475 PCR_BLITTER pBlitter = pTex->pBlitter;
1477 if (!pBlitter->Flags.SupportsPBO)
1480 pBlitter->pDispatch->GenBuffersARB(1, &pTex->idPBO);
1487 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO);
1488 pBlitter->pDispatch->BufferDataARB(GL_PIXEL_PACK_BUFFER_ARB,
1491 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
1494 static uint32_t crTdBltTexCreate(PCR_BLITTER pBlitter, uint32_t width, uint32_t height, GLenum enmTarget)
1497 pBlitter->pDispatch->GenTextures(1, &tex);
1504 pBlitter->pDispatch->BindTexture(enmTarget, tex);
1505 pBlitter->pDispatch->TexParameteri(enmTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1506 pBlitter->pDispatch->TexParameteri(enmTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1507 pBlitter->pDispatch->TexParameteri(enmTarget, GL_TEXTURE_WRAP_S, GL_CLAMP);
1508 pBlitter->pDispatch->TexParameteri(enmTarget, GL_TEXTURE_WRAP_T, GL_CLAMP);
1509 pBlitter->pDispatch->TexImage2D(enmTarget, 0, GL_RGBA8,
1515 pBlitter->pDispatch->BindTexture(enmTarget, 0);
1525 pTex->idInvertTex = crTdBltTexCreate(pTex->pBlitter, pTex->Tex.width, pTex->Tex.height, pTex->Tex.target);
1557 PCR_BLITTER pBlitter = pTex->pBlitter;
1559 Assert(CrBltIsEntered(pBlitter));
1563 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO);
1564 pBlitter->pDispatch->UnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1565 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
1591 PCR_BLITTER pBlitter = pTex->pBlitter;
1592 Assert(CrBltIsEntered(pBlitter));
1593 pBlitter->pDispatch->BindTexture(pTex->Tex.target, fInverted ? pTex->idInvertTex : pTex->Tex.hwid);
1595 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO);
1601 pBlitter->pDispatch->UnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
1614 pBlitter->pDispatch->BindTexture(pTex->Tex.target, 0);
1623 pBlitter->pDispatch->GetTexImage(GL_TEXTURE_2D, 0, enmFormat, GL_UNSIGNED_BYTE, pvData);
1626 pBlitter->pDispatch->BindTexture(pTex->Tex.target, 0);
1630 pvData = pBlitter->pDispatch->MapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
1637 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
1744 PCR_BLITTER pBlitter = pTex->pBlitter;
1748 Assert(CrBltIsEntered(pBlitter));
1752 pBlitter->pDispatch->DeleteBuffersARB(1, &pTex->idPBO);
1759 Assert(CrBltIsEntered(pBlitter));
1763 pBlitter->pDispatch->DeleteTextures(1, &pTex->idInvertTex);
1867 CrBltBlitTexTex(pTex->pBlitter, &pTex->Tex, &SrcRect, &InvertTex, &DstRect, 1, 0);
1893 PCR_BLITTER pBlitter = pTexture->pBlitter;
1895 int rc = CrBltEnter(pBlitter);
1904 pBlitter->pDispatch->DeleteTextures(1, &pTexture->Tex.hwid);
1906 CrBltLeave(pBlitter);
1911 static int ctTdBltSdCreate(PCR_BLITTER pBlitter, uint32_t width, uint32_t height, GLenum enmTarget, PCR_TEXDATA *ppScaledCache)
1915 Assert(CrBltIsEntered(pBlitter));
1930 Tex.hwid = crTdBltTexCreate(pBlitter, width, height, enmTarget);
1938 CrTdInit(pScaledCache, &Tex, pBlitter, ctTdBltSdReleased);
1947 Assert(CrBltIsEntered(pTex->pBlitter));
1955 int rc = ctTdBltSdCreate(pTex->pBlitter, width, height, pTex->Tex.target, &pScaledCache);
1974 int rc = ctTdBltSdCreate(pTex->pBlitter, width, height, pTex->Tex.target, &pScaledCache);
2010 pTex->pBlitter->pDispatch->DeleteTextures(1, &pTex->pScaledCache->Tex.hwid);
2049 CrBltBlitTexTex(pTex->pBlitter, &pTex->Tex, &SrcRect, &pScaledCache->Tex, &DstRect, 1, 0);