void _glshDereferenceRenderbuffer( GLContext Context, GLRenderbuffer Renderbuffer ) { gcmASSERT((Renderbuffer->object.reference - 1) >= 0); if (--Renderbuffer->object.reference == 0) { if (Renderbuffer->surface != gcvNULL) { if (Renderbuffer->combined == gcvNULL) { gcmVERIFY_OK(gcoSURF_Destroy(Renderbuffer->surface)); } else { Renderbuffer->combined->combined = gcvNULL; } } gcmVERIFY_OK(gcmOS_SAFE_FREE(gcvNULL, Renderbuffer)); } }
static Bool VDestroySurf16() { gceSTATUS status = gcvSTATUS_OK; if (_vsurf16.surf==NULL) TRACE_EXIT(TRUE); status=gcoSURF_Unlock(_vsurf16.surf, &(_vsurf16.lineaddr)); if (status!=gcvSTATUS_OK) TRACE_EXIT(FALSE); status=gcoSURF_Destroy(_vsurf16.surf); _vsurf16.surf=NULL; TRACE_EXIT(TRUE); }
gceSTATUS _FreeSurface( IN gcsSURFACE * Surface ) { gceSTATUS status = gcvSTATUS_OK; if (Surface == gcvNULL) { return gcvSTATUS_INVALID_ARGUMENT; } do { if (Surface->surface != gcvNULL) { if (Surface->logical != gcvNULL) { gcmERR_BREAK( gcoSURF_Unlock(Surface->surface, Surface->logical)); } gcmERR_BREAK( gcoSURF_Destroy(Surface->surface)); Surface->surface = gcvNULL; Surface->physical = ~0; Surface->logical = gcvNULL; Surface->width = 0; Surface->height = 0; Surface->format = gcvSURF_UNKNOWN; } } while (gcvFALSE); return status; }
gceSTATUS _FitSurface( IN gcsCOPYBIT_CONTEXT * Context, IN gcsSURFACE * Surface, IN gctUINT32 Width, IN gctUINT32 Height ) { gceSTATUS status = gcvSTATUS_OK; if (Surface == gcvNULL) { return gcvSTATUS_INVALID_ARGUMENT; } do { /* Create the tmp Surfaceace if necessary. */ if ((Surface->surface == gcvNULL) || (Surface->width < Width) || (Surface->height < Height) ) { /* Destroy last surface. */ if (Surface->surface != gcvNULL) { if (Surface->logical != gcvNULL) { gcmERR_BREAK( gcoSURF_Unlock(Surface->surface, Surface->logical)); } gcmERR_BREAK( gcoSURF_Destroy(Surface->surface)); } /* New surface values. */ Surface->format = gcvSURF_A8R8G8B8; Surface->width = Width; Surface->height = Height; gcmERR_BREAK( gcoSURF_Construct(gcvNULL, Surface->width, Surface->height, 1, gcvSURF_BITMAP, Surface->format, gcvPOOL_DEFAULT, &Surface->surface)); gcmERR_BREAK( gcoSURF_Lock(Surface->surface, &Surface->physical, &Surface->logical)); gcmERR_BREAK( gcoSURF_GetAlignedSize(Surface->surface, &Surface->alignedWidth, &Surface->alignedHeight, &Surface->stride)); } } while (gcvFALSE); return status; }
gceSTATUS GC2D_Accelerator::DestroyGALSurface( IN gcoSURF Surface ) { return gcoSURF_Destroy(Surface); }
/******************************************************************************* ** ** _WorkaroundForFilterBlit ** ** Workaround for the dirty region issue of filter blit. ** It only exists for old GC300 before 2.0.2 (included). ** ** INPUT: ** ** gctHAL Hal ** Pointer to HAL. ** ** OUTPUT: ** ** Nothing. */ static gceSTATUS _WorkaroundForFilterBlit( IN gcoHAL Hal ) { gceSTATUS status; gcoSURF srcSurf = gcvNULL; gcsRECT srcRect; gcoSURF dstSurf = gcvNULL; gcsRECT dstRect; do { gcmERR_BREAK(gcoSURF_Construct( gcvNULL, 256, 256, 1, gcvSURF_BITMAP, gcvSURF_A8R8G8B8, gcvPOOL_DEFAULT, &srcSurf )); gcmERR_BREAK(gcoSURF_Construct( gcvNULL, 256, 256, 1, gcvSURF_BITMAP, gcvSURF_A8R8G8B8, gcvPOOL_DEFAULT, &dstSurf )); srcRect.left = 0; srcRect.top = 0; srcRect.right = 64; srcRect.bottom = 16; dstRect.left = 0; dstRect.top = 0; dstRect.right = 128; dstRect.bottom = 32; gcmERR_BREAK(gcoSURF_FilterBlit( srcSurf, dstSurf, &srcRect, &dstRect, gcvNULL )); gcmERR_BREAK(gcoSURF_Destroy(srcSurf)); srcSurf = gcvNULL; gcmERR_BREAK(gcoSURF_Destroy(dstSurf)); dstSurf = gcvNULL; } while(gcvFALSE); if (gcmIS_ERROR(status)) { gcmTRACE_ZONE(gcvLEVEL_ERROR, gcvZONE_HAL, "Failed to workarond for GC300."); if (srcSurf) { gcmVERIFY_OK(gcoSURF_Destroy(srcSurf)); } if (dstSurf) { gcmVERIFY_OK(gcoSURF_Destroy(dstSurf)); } } return status; }