556adfa6b9
Renaming glamor_priv->dispatch and wrapping the access to the dispatch table with a function that also ensured the context was bound. dispatch = glamor_get_dispatch(glamor_priv); ... glamor_put_dispatch(glamor_priv); So that we catch all places where we attempt to call into GL withouta context. As an optimisation we can then do glamor_get_context(); glamor_put_context() around the rendering entry points to reduce the frequency of having to restore the old context. (Along with allowing the context to be recursively acquired and making the old context part of the glamor_egl state.) Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com> Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
110 lines
2.9 KiB
C
110 lines
2.9 KiB
C
#include <stdlib.h>
|
|
|
|
#include "glamor_priv.h"
|
|
#include "mipict.h"
|
|
|
|
/* Upload picture to texture. We may need to flip the y axis or
|
|
* wire alpha to 1. So we may conditional create fbo for the picture.
|
|
* */
|
|
enum glamor_pixmap_status
|
|
glamor_upload_picture_to_texture(PicturePtr picture)
|
|
{
|
|
PixmapPtr pixmap;
|
|
assert(picture->pDrawable);
|
|
pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
|
|
|
|
return glamor_upload_pixmap_to_texture(pixmap);
|
|
}
|
|
|
|
|
|
Bool
|
|
glamor_prepare_access_picture(PicturePtr picture, glamor_access_t access)
|
|
{
|
|
if (!picture || !picture->pDrawable)
|
|
return TRUE;
|
|
|
|
return glamor_prepare_access(picture->pDrawable, access);
|
|
}
|
|
|
|
void
|
|
glamor_finish_access_picture(PicturePtr picture, glamor_access_t access)
|
|
{
|
|
if (!picture || !picture->pDrawable)
|
|
return;
|
|
|
|
glamor_finish_access(picture->pDrawable, access);
|
|
}
|
|
|
|
/*
|
|
* We should already have drawable attached to it, if it has one.
|
|
* Then set the attached pixmap to is_picture format, and set
|
|
* the pict format.
|
|
* */
|
|
int
|
|
glamor_create_picture(PicturePtr picture)
|
|
{
|
|
PixmapPtr pixmap;
|
|
glamor_pixmap_private *pixmap_priv;
|
|
glamor_screen_private *glamor_priv;
|
|
|
|
if (!picture || !picture->pDrawable)
|
|
return 0;
|
|
|
|
glamor_priv =
|
|
glamor_get_screen_private(picture->pDrawable->pScreen);
|
|
pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
|
|
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
|
if (!pixmap_priv) {
|
|
/* We must create a pixmap priv to track the picture format even
|
|
* if the pixmap is a pure in memory pixmap. The reason is that
|
|
* we may need to upload this pixmap to a texture on the fly. During
|
|
* the uploading, we need to know the picture format. */
|
|
glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
|
|
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
|
} else {
|
|
if (GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
|
|
/* If the picture format is not compatible with glamor fbo format,
|
|
* we have to mark this pixmap as a separated texture, and don't
|
|
* fallback to DDX layer. */
|
|
if (pixmap_priv->type == GLAMOR_TEXTURE_DRM
|
|
&& !glamor_pict_format_is_compatible(picture->format,
|
|
pixmap->drawable.depth))
|
|
glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE);
|
|
}
|
|
}
|
|
|
|
pixmap_priv->is_picture = 1;
|
|
pixmap_priv->pict_format = picture->format;
|
|
|
|
return miCreatePicture(picture);
|
|
}
|
|
|
|
void
|
|
glamor_destroy_picture(PicturePtr picture)
|
|
{
|
|
PixmapPtr pixmap;
|
|
glamor_pixmap_private *pixmap_priv;
|
|
glamor_screen_private *glamor_priv;
|
|
|
|
if (!picture || !picture->pDrawable)
|
|
return;
|
|
|
|
glamor_priv =
|
|
glamor_get_screen_private(picture->pDrawable->pScreen);
|
|
pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
|
|
pixmap_priv = glamor_get_pixmap_private(pixmap);
|
|
|
|
if (pixmap_priv) {
|
|
pixmap_priv->is_picture = 0;
|
|
pixmap_priv->pict_format = 0;
|
|
}
|
|
miDestroyPicture(picture);
|
|
}
|
|
|
|
void
|
|
glamor_picture_format_fixup(PicturePtr picture,
|
|
glamor_pixmap_private * pixmap_priv)
|
|
{
|
|
pixmap_priv->pict_format = picture->format;
|
|
}
|