return (rect1.x2 - rect1.x1) * (rect1.y2 - rect1.y1);
}
+static int driFreeDrawable(__DRIcontext *pcp)
+{
+ __DRIdrawable *pdp;
+ __DRIdrawable *prp;
+
+ if (pcp == NULL)
+ return GL_FALSE;
+
+ pdp = pcp->driDrawablePriv;
+ prp = pcp->driReadablePriv;
+
+ /* already unbound */
+ if (!pdp && !prp)
+ return GL_TRUE;
+
+ if (pdp->refcount == 0) {
+ /* ERROR!!! */
+ return GL_FALSE;
+ }
+
+ dri_put_drawable(pdp);
+
+ if (prp != pdp) {
+ if (prp->refcount == 0) {
+ /* ERROR!!! */
+ return GL_FALSE;
+ }
+
+ dri_put_drawable(prp);
+ }
+
+
+ /* XXX this is disabled so that if we call SwapBuffers on an unbound
+ * window we can determine the last context bound to the window and
+ * use that context's lock. (BrianP, 2-Dec-2000)
+ */
+ pcp->driDrawablePriv = pcp->driReadablePriv = NULL;
+ return GL_TRUE;
+}
+
/*****************************************************************/
/** \name Context (un)binding functions */
/*****************************************************************/
static int driUnbindContext(__DRIcontext *pcp)
{
__DRIscreen *psp;
- __DRIdrawable *pdp;
- __DRIdrawable *prp;
/*
** Assume error checking is done properly in glXMakeCurrent before
return GL_FALSE;
psp = pcp->driScreenPriv;
- pdp = pcp->driDrawablePriv;
- prp = pcp->driReadablePriv;
- /* already unbound */
- if (!pdp && !prp)
- return GL_TRUE;
- /* Let driver unbind drawable from context */
+ /* Let driver unbind drawable from context */
(*psp->DriverAPI.UnbindContext)(pcp);
- if (pdp->refcount == 0) {
- /* ERROR!!! */
- return GL_FALSE;
- }
-
- dri_put_drawable(pdp);
-
- if (prp != pdp) {
- if (prp->refcount == 0) {
- /* ERROR!!! */
- return GL_FALSE;
- }
-
- dri_put_drawable(prp);
- }
-
-
- /* XXX this is disabled so that if we call SwapBuffers on an unbound
- * window we can determine the last context bound to the window and
- * use that context's lock. (BrianP, 2-Dec-2000)
- */
- pcp->driDrawablePriv = pcp->driReadablePriv = NULL;
-
#if 0
/* Unbind the drawable */
pdp->driContextPriv = &psp->dummyContextPriv;
/* Bind the drawable to the context */
- if (pcp) {
- pcp->driDrawablePriv = pdp;
- pcp->driReadablePriv = prp;
- if (pdp) {
- pdp->driContextPriv = pcp;
- dri_get_drawable(pdp);
- }
- if ( prp && pdp != prp ) {
- dri_get_drawable(prp);
+ if (pcp) {
+
+ if (pcp->driDrawablePriv != pdp
+ || pcp->driReadablePriv != prp)
+ {
+ /* first increment ref count for new drawables */
+
+ if (pdp)
+ {
+ pdp->driContextPriv = pcp;
+ dri_get_drawable(pdp);
+ }
+
+ if (prp && prp != pdp)
+ {
+ dri_get_drawable(prp);
+ }
+
+ /* free old drawables */
+
+ if (pcp->driReadablePriv
+ && pcp->driReadablePriv != pcp->driDrawablePriv)
+ {
+ dri_put_drawable(pcp->driReadablePriv);
+ }
+
+ if (pcp->driDrawablePriv)
+ {
+ dri_put_drawable(pcp->driDrawablePriv);
+ }
+
+ /* assign new drawables to context */
+
+ pcp->driDrawablePriv = pdp;
+ pcp->driReadablePriv = prp;
+
+ }
}
- }
/*
** Now that we have a context associated with this drawable, we can
driDestroyContext(__DRIcontext *pcp)
{
if (pcp) {
+ driFreeDrawable(pcp);
(*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
_mesa_free(pcp);
}
pcp->driScreenPriv = psp;
pcp->driDrawablePriv = NULL;
+ pcp->driReadablePriv = NULL;
/* When the first context is created for a screen, initialize a "dummy"
* context.