else
#endif //NO_CRTC_MODE
if (pSec->isLcdOff)
+ {
+ XDBG_DEBUG(MLYR, "pSec->isLcdOff (%d)\n", pSec->isLcdOff);
return;
+ }
pipe = secDisplayCrtcPipe (layer->pScrn, _GetCrtcID (layer));
}
layer->ref_cnt = 1;
-
xorg_list_init (&layer->noti_data);
_secLayerInitList ();
XDBG_RETURN_IF_FAIL (layer != NULL);
pSecMode = (SECModePtr) SECPTR (layer->pScrn)->pSecMode;
-
+#if 1
if (!layer->visible || layer->ref_cnt > 1)
return;
XDBG_TRACE (MLYR, "layer(%p) hidden. \n", layer);
return;
}
-
+#endif
if (!secPlaneHide (layer->plane_id))
return;
return FALSE;
}
- if (buf_h < MIN_HEIGHT || buf_h % 2)
+ if (buf_h < MIN_HEIGHT)
{
- XDBG_TRACE (MPLN, "hide: buf_h(%d) not 2's multiple or less than %d\n",
+ XDBG_TRACE (MPLN, "hide: buf_h(%d) less than %d\n",
buf_h, MIN_HEIGHT);
return FALSE;
}
#define CVT_BUF_MAX 6
#endif
+static Bool can_pause = TRUE;
+
typedef struct _SECCvtFuncData
{
CvtFunc func;
#endif
Bool started;
+ Bool paused;
Bool first_event;
struct xorg_list link;
Bool
secCvtSetProperpty (SECCvt *cvt, SECCvtProp *src, SECCvtProp *dst)
{
- if (cvt->started)
+ if (cvt->started && !cvt->paused)
return TRUE;
struct drm_exynos_ipp_property property;
cvt->started = TRUE;
}
+ else if (cvt->paused)
+ {
+ struct drm_exynos_ipp_cmd_ctrl ctrl = {0,};
+
+ ctrl.prop_id = cvt->prop_id;
+ ctrl.ctrl = IPP_CTRL_RESUME;
+
+ if (!secDrmIppCmdCtrl (cvt->pScrn, &ctrl))
+ goto fail_to_convert;
+
+ XDBG_TRACE (MCVT, "cvt(%p) resume.\n", cvt);
+
+ cvt->paused = FALSE;
+ }
dst->dirty = TRUE;
_secCvtDequeued (cvt, EXYNOS_DRM_OPS_SRC, buf_idx[EXYNOS_DRM_OPS_SRC]);
_secCvtDequeued (cvt, EXYNOS_DRM_OPS_DST, buf_idx[EXYNOS_DRM_OPS_DST]);
}
+
+Bool
+secCvtPause (SECCvt *cvt)
+{
+ if (!can_pause)
+ {
+ XDBG_DEBUG (MCVT, "IPP not support pause-resume mode\n");
+ return FALSE;
+ }
+ XDBG_RETURN_VAL_IF_FAIL (cvt != NULL, FALSE);
+ struct drm_exynos_ipp_cmd_ctrl ctrl = {0,};
+
+ ctrl.prop_id = cvt->prop_id;
+ ctrl.ctrl = IPP_CTRL_PAUSE;
+
+ if (!secDrmIppCmdCtrl (cvt->pScrn, &ctrl))
+ goto fail_to_pause;
+
+ XDBG_TRACE (MCVT, "cvt(%p) pause.\n", cvt);
+
+ cvt->paused = TRUE;
+
+ return TRUE;
+
+fail_to_pause:
+
+ XDBG_ERROR (MCVT, "cvt(%p) pause error.\n", cvt);
+ can_pause = FALSE;
+
+// _secCvtStop (cvt);
+
+ return FALSE;
+}
void secCvtRemoveCallback (SECCvt *cvt, CvtFunc func, void *data);
void secCvtHandleIppEvent (int fd, unsigned int *buf_idx, void *data, Bool error);
+Bool secCvtPause (SECCvt *cvt);
#endif /* __SEC_CONVERTER_H__ */
XDBG_DEBUG (MVDO, "######################## \n");
XDBG_DEBUG (MVDO, "cvt(%p) src(%p) dst(%p)\n", cvt, src, dst);
-
+#if 0
if (pPort->wait_vbuf != src)
XDBG_WARNING (MVDO, "wait_vbuf(%p) != src(%p). \n",
pPort->wait_vbuf, src);
-
+#endif
pPort->wait_vbuf = NULL;
XDBG_DEBUG (MVDO, "########################.. \n");
XDBG_RETURN_IF_FAIL (pPort != NULL);
XDBG_RETURN_IF_FAIL (VBUF_IS_VALID (vbuf));
-
+#if 0
if (pPort->wait_vbuf != vbuf)
XDBG_WARNING (MVDO, "wait_vbuf(%p) != vbuf(%p). \n",
pPort->wait_vbuf, vbuf);
-
+#endif
XDBG_DEBUG (MVBUF, "now_showing(%p). \n", vbuf);
pPort->wait_vbuf = NULL;
PixmapPtr pPixmap = _getPixmap (pPort->d.pDraw);
SECPtr pSec = SECPTR (pPort->pScrn);
- if (pPort->drawing != ON_FB || !pSec->pVideoPriv->video_punch)
+ if (pPort->drawing != ON_FB)
+ {
+ XDBG_DEBUG (MVDO, "pPort->drawing (%d), pSec->pVideoPriv->video_punch (%d)\n",
+ pPort->drawing, pSec->pVideoPriv->video_punch);
return;
+ }
if (!pPort->punched)
{
+ DamageRegionAppend(pPort->d.pDraw, pPort->d.clip_boxes);
secExaPrepareAccess (pPixmap, EXA_PREPARE_DEST);
if (pPixmap->devPrivate.ptr)
memset (pPixmap->devPrivate.ptr, 0,
pPixmap->drawable.width * pPixmap->drawable.height * 4);
secExaFinishAccess (pPixmap, EXA_PREPARE_DEST);
+ DamageRegionProcessPending(pPort->d.pDraw);
XDBG_TRACE (MVDO, "Punched (%dx%d) %p. \n",
pPixmap->drawable.width, pPixmap->drawable.height,
pPixmap->devPrivate.ptr);
pPort->punched = TRUE;
+#if 0
DamageDamageRegion (pPort->d.pDraw, pPort->d.clip_boxes);
+#endif
}
}
Bool first_put = FALSE;
if (!(output & OUTPUT_EXT))
+ {
+ XDBG_DEBUG(MTVO, "!(output (%d) & OUTPUT_EXT)\n", output);
return FALSE;
+ }
if (pPort->skip_tvout)
+ {
+ XDBG_DEBUG(MTVO, "pPort->skip_tvout (%d)\n", pPort->skip_tvout);
return FALSE;
+ }
if (!_secVideoGrabTvout(pPort))
goto fail_to_put_tvout;
sub, inbuf->stamp,
inbuf->keys[0], inbuf->keys[1], inbuf->keys[2]);
}
-
+ XDBG_DEBUG (MVDO, "pPort->wait_vbuf (%d) skip_frame\n", pPort->wait_vbuf);
return FALSE;
}
else if (pSec->pVideoPriv->video_fps)
_secVideoCloseConverter (pPort);
_secVideoCloseOutBuffer (pPort, FALSE);
pPort->inbuf_is_fb = FALSE;
- if (pPort->tv)
+ }
+
+ if (pPort->tv)
+ {
+ SECCvt *tv_cvt = secVideoTvGetConverter (pPort->tv);
+ if (pPort->d.id != pPort->old_d.id ||
+ pPort->d.width != pPort->old_d.width ||
+ pPort->d.height != pPort->old_d.height ||
+ memcmp (&pPort->d.src, &pPort->old_d.src, sizeof (xRectangle)))
+ {
+ _secVideoCloseInBuffer (pPort);
+ pPort->inbuf_is_fb = FALSE;
+ }
+ else if (tv_cvt != NULL)
+ {
+ SECCvtProp dst_prop;
+ secCvtGetProperpty (tv_cvt, NULL, &dst_prop);
+
+ if (dst_prop.degree != pPort->hw_rotate ||
+ dst_prop.hflip != pPort->hflip ||
+ dst_prop.vflip != pPort->vflip ||
+ dst_prop.secure != pPort->secure ||
+ dst_prop.csc_range != pPort->csc_range)
+ {
+ _secVideoCloseInBuffer (pPort);
+ pPort->inbuf_is_fb = FALSE;
+ }
+ }
+
+ if (pPort->tv && memcmp (&pPort->d.dst, &pPort->old_d.dst, sizeof (xRectangle)))
{
if (secVideoTvResizeOutput (pPort->tv, &pPort->d.src, &pPort->d.dst) == TRUE)
{
- pPort->wait_vbuf = NULL;
SECCvt *tv_cvt = secVideoTvGetConverter (pPort->tv);
if (tv_cvt != NULL)
{
pPort->tv = NULL;
}
pPort->punched = FALSE;
+ pPort->wait_vbuf = NULL;
}
}
if (tv->outbuf[i] && !VBUF_IS_CONVERTING (tv->outbuf[i]) && !tv->outbuf[i]->showing)
{
- tv->outbuf_index = i;
- return tv->outbuf[i];
+ if (tv->outbuf[i]->width == width &&
+ tv->outbuf[i]->id == tv->convert_id &&
+ tv->outbuf[i]->height == height)
+ {
+ tv->outbuf_index = i;
+ return tv->outbuf[i];
+ }
+ else
+ {
+ secUtilVideoBufferUnref (tv->outbuf[i]);
+ SECPtr pSec = SECPTR (tv->pScrn);
+ tv->outbuf[i] = secUtilAllocVideoBuffer (tv->pScrn, tv->convert_id, width, height,
+ (pSec->scanout)?TRUE:FALSE, TRUE, secure);
+ XDBG_RETURN_VAL_IF_FAIL (tv->outbuf[i] != NULL, NULL);
+
+ XDBG_DEBUG (MTVO, "outbuf(%p, %c%c%c%c)\n", tv->outbuf[i], FOURCC_STR (tv->convert_id));
+
+ tv->outbuf_index = i;
+ return tv->outbuf[i];
+ }
}
}
else
XDBG_DEBUG (MTVO, "rect (%d,%d %dx%d) \n",
rect->x, rect->y, rect->width, rect->height);
- if (tv->is_resized == 1)
- {
- secLayerFreezeUpdate (tv->layer, FALSE);
- tv->is_resized = 0;
- }
#if 0
if (tv->lpos == LAYER_LOWER1)
if (!_secVideoTvCalSize (tv, vbuf->width, vbuf->height,
return 0;
}
#endif
- secLayerSetRect (tv->layer, &vbuf->crop, rect);
+ xRectangle src_rect, dst_rect;
+ secLayerGetRect (tv->layer, &src_rect, &dst_rect);
+
+ if (tv->is_resized == 1)
+ {
+ secLayerFreezeUpdate (tv->layer, FALSE);
+// secLayerHide (tv->layer);
+ tv->is_resized = 0;
+ }
+
+ if (memcmp (&vbuf->crop, &src_rect, sizeof (xRectangle)) ||
+ memcmp (rect, &dst_rect, sizeof (xRectangle)))
+ {
+ secLayerFreezeUpdate (tv->layer, TRUE);
+ secLayerSetRect (tv->layer, &vbuf->crop, rect);
+ secLayerFreezeUpdate (tv->layer, FALSE);
+ }
ret = secLayerSetBuffer (tv->layer, vbuf);
if (ret == 0)
return 0;
-
- secLayerShow (tv->layer);
-
+ if (!secLayerIsVisible (tv->layer))
+ {
+ secLayerShow (tv->layer);
+ }
+ else
+ {
+ XDBG_DEBUG(MTVO,"tv->layer(%p) is not visible\n", tv->layer);
+ }
return ret;
}
if (tv == NULL)
return FALSE;
- if (tv->outbuf)
+ if (!secVideoCanDirectDrawing (tv, src->width, src->height,
+ dst->width, dst->height))
{
- int i;
- for (i = 0; i < tv->outbuf_num; i++)
- if (tv->outbuf[i])
- secUtilVideoBufferUnref (tv->outbuf[i]);
-
- free (tv->outbuf);
- tv->outbuf = NULL;
+ secVideoTvReCreateConverter(tv);
}
-
- if (tv->cvt)
+ else
{
- secCvtDestroy (tv->cvt);
- tv->cvt = NULL;
+ if (tv->cvt)
+ {
+ secCvtDestroy (tv->cvt);
+ }
}
- if (!secVideoCanDirectDrawing (tv, src->width, src->height,
- dst->width, dst->height))
+ if (tv->outbuf)
{
- secVideoTvReCreateConverter(tv);
+ int i;
+ for (i = 0; i < tv->outbuf_num; i++)
+ if (tv->outbuf[i] && !VBUF_IS_CONVERTING(tv->outbuf[i]) && !tv->outbuf[i]->showing)
+ {
+ secUtilVideoBufferUnref (tv->outbuf[i]);
+ tv->outbuf[i] = NULL;
+ }
+ tv->outbuf_index = -1;
}
secLayerFreezeUpdate (tv->layer, TRUE);
dst_prop.csc_range = csc_range;
if (!secCvtEnsureSize (&src_prop, &dst_prop))
+ {
+ XDBG_DEBUG(MTVO, "Can't ensure size\n");
return 0;
+ }
outbuf = _secVideoTvGetOutBuffer (tv, dst_prop.width, dst_prop.height, vbuf->secure);
if (!outbuf)
+ {
+ XDBG_DEBUG(MTVO, "Can't get outbuf\n");
return 0;
+ }
outbuf->crop = dst_prop.crop;
if (!secCvtSetProperpty (tv->cvt, &src_prop, &dst_prop))
+ {
+ XDBG_DEBUG(MTVO, "Can't set cvt property\n");
return 0;
+ }
if (!secCvtConvert (tv->cvt, vbuf, outbuf))
+ {
+ XDBG_DEBUG(MTVO, "Can't start cvt\n");
return 0;
+ }
XDBG_TRACE (MTVO, "'%c%c%c%c' %dx%d (%d,%d %dx%d) => '%c%c%c%c' %dx%d (%d,%d %dx%d) convert. rect(%d,%d %dx%d)\n",
FOURCC_STR (vbuf->id), vbuf->width, vbuf->height,
XDBG_RETURN_VAL_IF_FAIL(src_h != 0, FALSE);
XDBG_RETURN_VAL_IF_FAIL(dst_w != 0, FALSE);
XDBG_RETURN_VAL_IF_FAIL(dst_h != 0, FALSE);
+#if 1
+ /* :TODO. Need Fix flickering in direct draw case */
+ return FALSE;
+#endif
int ratio_w = 0;
int ratio_h = 0;
XDBG_DEBUG(MTVO, "tv(%p) src_w %d, src_h %d, dst_w %d, dst_h %d\n",
return FALSE;
}
}
+#if 0
+ /* FIXME: Using IPP converter if we haven't native frame size */
+ if (ratio_w > 1 || ratio_h > 1)
+ {
+ XDBG_DEBUG(MTVO, "Can't direct draw ratio_w (%d) && ratio_h (%d) != 1\n", ratio_w, ratio_h);
+ return FALSE;
+ }
+#endif
XDBG_DEBUG(MTVO, "Support direct drawing\n");
return TRUE;
}