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);
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
gceSTATUS GC2D_Accelerator::DestroyGALSurface(
        IN gcoSURF Surface
        )
{
    return gcoSURF_Destroy(Surface);
}
Ejemplo n.º 6
0
/*******************************************************************************
**
**  _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;
}