Exemplo n.º 1
0
/* Return the parameters of a drawable that are needed by the EGL layer */
static WSEGLError wseglGetDrawableParameters
    (WSEGLDrawableHandle _drawable, WSEGLDrawableParams *sourceParams,
     WSEGLDrawableParams *renderParams)
{
    struct wl_egl_window *eglwindow = (struct wl_egl_window *) _drawable;
    PVR2DMEMINFO *source, *render;

    if (eglwindow->header.type == WWSEGL_DRAWABLE_TYPE_PIXMAP)
    {
        struct wl_egl_pixmap *pixmap = (struct wl_egl_pixmap *) _drawable;
        
        sourceParams->ui32Width = pixmap->width;
        sourceParams->ui32Height = pixmap->height;
        sourceParams->ui32Stride = pixmap->stride / 4;
        sourceParams->ePixelFormat = WSEGL_PIXELFORMAT_8888;   
        sourceParams->pvLinearAddress = pixmap->pvrmem->pBase;
        sourceParams->ui32HWAddress = pixmap->pvrmem->ui32DevAddr;
        sourceParams->hPrivateData = pixmap->pvrmem->hPrivateData;

        renderParams->ui32Width = pixmap->width;
        renderParams->ui32Height = pixmap->height;
        renderParams->ui32Stride = pixmap->stride / 4;
        renderParams->ePixelFormat = WSEGL_PIXELFORMAT_8888;
        renderParams->pvLinearAddress = pixmap->pvrmem->pBase;
        renderParams->ui32HWAddress = pixmap->pvrmem->ui32DevAddr;
        renderParams->hPrivateData = pixmap->pvrmem->hPrivateData;

        return WSEGL_SUCCESS;
    }

    if (!wseglGetBuffers(eglwindow, &source, &render))
    {
       return WSEGL_BAD_DRAWABLE;
    }
    
    sourceParams->ui32Width = eglwindow->width;
    sourceParams->ui32Height = eglwindow->height;
    sourceParams->ui32Stride = eglwindow->stridePixels;
    sourceParams->ePixelFormat = eglwindow->format;   
    sourceParams->pvLinearAddress = source->pBase;
    sourceParams->ui32HWAddress = source->ui32DevAddr;
    sourceParams->hPrivateData = source->hPrivateData;

    renderParams->ui32Width = eglwindow->width;
    renderParams->ui32Height = eglwindow->height;
    renderParams->ui32Stride = eglwindow->stridePixels;
    renderParams->ePixelFormat = eglwindow->format;
    renderParams->pvLinearAddress = render->pBase;
    renderParams->ui32HWAddress = render->ui32DevAddr;
    renderParams->hPrivateData = render->hPrivateData;

    return WSEGL_SUCCESS;

}
/* Return the parameters of a drawable that are needed by the EGL layer */
static WSEGLError wseglGetDrawableParameters
    (WSEGLDrawableHandle _drawable, WSEGLDrawableParams *sourceParams,
     WSEGLDrawableParams *renderParams)
     {
/*
 * [22:26:17] <Stskeeps> note: you'll need this in future:
 * [22:26:19] <Stskeeps> if static WSEGLError wseglGetDrawableParameters
 * [22:26:19] <Stskeeps> 651
 * [22:26:33] <Stskeeps> returns return WSEGL_BAD_DRAWABLE;
 * [22:26:38] <Stskeeps> it'll re-create the drawable
 * [22:26:50] <Stskeeps> do this when window format,  height,  width has changed
 */
    struct wl_egl_window *eglwindow = (struct wl_egl_window *) _drawable;
    PVR2DMEMINFO *source, *render;

    if (eglwindow->header.type == WWSEGL_DRAWABLE_TYPE_PIXMAP)
    {
        struct wl_egl_pixmap *pixmap = (struct wl_egl_pixmap *) _drawable;

        int strideDiv = 0;

        switch (pixmap->format) {
            case WSEGL_PIXELFORMAT_565:
                strideDiv = 2;
                break;
            case WSEGL_PIXELFORMAT_8888:
                strideDiv = 4;
                break;
        }

        assert(strideDiv != 0);

        sourceParams->ui32Width = pixmap->width;
        sourceParams->ui32Height = pixmap->height;
        sourceParams->ui32Stride = pixmap->stride / strideDiv;
        sourceParams->ePixelFormat = pixmap->format;
        sourceParams->pvLinearAddress = pixmap->pvrmem->pBase;
        sourceParams->ui32HWAddress = pixmap->pvrmem->ui32DevAddr;
        sourceParams->hPrivateData = pixmap->pvrmem->hPrivateData;

        renderParams->ui32Width = pixmap->width;
        renderParams->ui32Height = pixmap->height;
        renderParams->ui32Stride = pixmap->stride / strideDiv;
        renderParams->ePixelFormat = pixmap->format;
        renderParams->pvLinearAddress = pixmap->pvrmem->pBase;
        renderParams->ui32HWAddress = pixmap->pvrmem->ui32DevAddr;
        renderParams->hPrivateData = pixmap->pvrmem->hPrivateData;

        return WSEGL_SUCCESS;
    }

    if (!wseglGetBuffers(eglwindow, &source, &render))
    {
       return WSEGL_BAD_DRAWABLE;
    }
    
    sourceParams->ui32Width = eglwindow->width;
    sourceParams->ui32Height = eglwindow->height;
    sourceParams->ui32Stride = eglwindow->stridePixels;
    sourceParams->ePixelFormat = eglwindow->format;   
    sourceParams->pvLinearAddress = source->pBase;
    sourceParams->ui32HWAddress = source->ui32DevAddr;
    sourceParams->hPrivateData = source->hPrivateData;

    renderParams->ui32Width = eglwindow->width;
    renderParams->ui32Height = eglwindow->height;
    renderParams->ui32Stride = eglwindow->stridePixels;
    renderParams->ePixelFormat = eglwindow->format;
    renderParams->pvLinearAddress = render->pBase;
    renderParams->ui32HWAddress = render->ui32DevAddr;
    renderParams->hPrivateData = render->hPrivateData;

    return WSEGL_SUCCESS;

}