18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/*
28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 
38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License");
58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License.
68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at
78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//      http://www.apache.org/licenses/LICENSE-2.0
98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol//
108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software
118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS,
128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and
148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License.
158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/
168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <HwcTrace.h>
188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <common/RotationBufferProvider.h>
198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android {
218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel {
228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define CHECK_VA_STATUS_RETURN(FUNC) \
248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolif (vaStatus != VA_STATUS_SUCCESS) {\
258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ETRACE(FUNC" failed. vaStatus = %#x", vaStatus);\
268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return false;\
278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define CHECK_VA_STATUS_BREAK(FUNC) \
308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolif (vaStatus != VA_STATUS_SUCCESS) {\
318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ETRACE(FUNC" failed. vaStatus = %#x", vaStatus);\
328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    break;\
338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// With this display value, VA will hook VED driver insead of VSP driver for buffer rotation
368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define DISPLAYVALUE  0x56454450
378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolRotationBufferProvider::RotationBufferProvider(Wsbm* wsbm)
398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    : mWsbm(wsbm),
408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mVaInitialized(false),
418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mVaDpy(0),
428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mVaCfg(0),
438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mVaCtx(0),
448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mVaBufFilter(0),
458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mSourceSurface(0),
468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mDisplay(DISPLAYVALUE),
478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mWidth(0),
488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mHeight(0),
498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mTransform(0),
508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mRotatedWidth(0),
518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mRotatedHeight(0),
528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mRotatedStride(0),
538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mTargetIndex(0),
548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mTTMWrappers(),
558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol      mBobDeinterlace(0)
568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (int i = 0; i < MAX_SURFACE_NUM; i++) {
588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mKhandles[i] = 0;
598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedSurfaces[i] = 0;
608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mDrmBuf[i] = NULL;
618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin PujolRotationBufferProvider::~RotationBufferProvider()
658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujoluint32_t RotationBufferProvider::getMilliseconds()
698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    struct timeval ptimeval;
718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    gettimeofday(&ptimeval, NULL);
728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return (uint32_t)((ptimeval.tv_sec * 1000) + (ptimeval.tv_usec / 1000));
738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::initialize()
768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (NULL == mWsbm)
788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mTTMWrappers.setCapacity(TTM_WRAPPER_COUNT);
808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::deinitialize()
848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    stopVA();
868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    reset();
878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::reset()
908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (mTTMWrappers.size()) {
928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        invalidateCaches();
938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::invalidateCaches()
978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void *buf;
998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (size_t i = 0; i < mTTMWrappers.size(); i++) {
1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        buf = mTTMWrappers.valueAt(i);
1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (!mWsbm->destroyTTMBuffer(buf))
1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            WTRACE("failed to free TTMBuffer");
1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mTTMWrappers.clear();
1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolint RotationBufferProvider::transFromHalToVa(int transform)
1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (transform == HAL_TRANSFORM_ROT_90)
1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return VA_ROTATION_90;
1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (transform == HAL_TRANSFORM_ROT_180)
1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return VA_ROTATION_180;
1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (transform == HAL_TRANSFORM_ROT_270)
1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return VA_ROTATION_270;
1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return 0;
1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolint RotationBufferProvider::getStride(bool isTarget, int width)
1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int stride = 0;
1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (width <= 512)
1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = 512;
1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    else if (width <= 1024)
1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = 1024;
1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    else if (width <= 1280) {
1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = 1280;
1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (isTarget)
1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            stride = 2048;
1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } else if (width <= 2048)
1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = 2048;
1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    else if (width <= 4096)
1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = 4096;
1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    else
1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = (width + 0x3f) & ~0x3f;
1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return stride;
1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbuffer_handle_t RotationBufferProvider::createWsbmBuffer(int width, int height, void **buf)
1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int size = width * height * 3 / 2; // YUV420 NV12 format
1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int allignment = 16 * 2048; // tiling row stride aligned
1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ret = mWsbm->allocateTTMBuffer(size, allignment, buf);
1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (ret == false) {
1468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("failed to allocate TTM buffer");
1478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return 0;
1488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
1498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return (buffer_handle_t) mWsbm->getKBufHandle(*buf);
1518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
1528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::createVaSurface(VideoPayloadBuffer *payload, int transform, bool isTarget)
1548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
1558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAStatus vaStatus;
1568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VASurfaceAttributeTPI attribTpi;
1578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VASurfaceAttributeTPI *vaSurfaceAttrib = &attribTpi;
1588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int stride;
1598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    unsigned long buffers;
1608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VASurfaceID *surface;
1618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int width = 0, height = 0, bufferHeight = 0;
1628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (isTarget) {
1648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (transFromHalToVa(transform) == VA_ROTATION_180) {
1658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            width = payload->width;
1668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            height = payload->height;
1678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        } else {
1688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            width = payload->height;
1698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            height = payload->width;
1708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
1718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedWidth = width;
1728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedHeight = height;
1738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        bufferHeight = (height + 0x1f) & ~0x1f;
1748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = getStride(isTarget, width);
1758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } else {
1768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        width = payload->width;
1778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        height = payload->height;
1788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        bufferHeight = (payload->height + 0x1f) & ~0x1f;
1798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride = payload->luma_stride; /* NV12 srouce buffer */
1808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
1818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!stride) {
1838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("invalid stride value");
1848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
1858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
1868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mBobDeinterlace = payload->bob_deinterlace;
1888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // adjust source target for Bob deinterlace
1898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!isTarget && mBobDeinterlace) {
1908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        height >>= 1;
1918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        bufferHeight >>= 1;
1928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stride <<= 1;
1938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
1948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
1958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->count = 1;
1968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->width = width;
1978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->height = height;
1988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->pixel_format = payload->format;
1998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->type = VAExternalMemoryKernelDRMBufffer;
2008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->tiling = payload->tiling;
2018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->size = (stride * bufferHeight * 3) / 2;
2028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->luma_offset = 0;
2038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->chroma_v_offset = stride * bufferHeight;
2048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->luma_stride = vaSurfaceAttrib->chroma_u_stride
2058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                 = vaSurfaceAttrib->chroma_v_stride
2068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                 = stride;
2078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->chroma_u_offset = vaSurfaceAttrib->chroma_v_offset;
2088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaSurfaceAttrib->buffers = &buffers;
2098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (isTarget) {
2118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        buffer_handle_t khandle = createWsbmBuffer(stride, bufferHeight, &mDrmBuf[mTargetIndex]);
2128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (khandle == 0) {
2138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ETRACE("failed to create buffer by wsbm");
2148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            return false;
2158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
2168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mKhandles[mTargetIndex] = khandle;
2188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaSurfaceAttrib->buffers[0] = (uintptr_t) khandle;
2198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedStride = stride;
2208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        surface = &mRotatedSurfaces[mTargetIndex];
2218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } else {
2228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaSurfaceAttrib->buffers[0] = (uintptr_t) payload->khandle;
2238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        surface = &mSourceSurface;
2248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        /* set src surface width/height to video crop size */
2258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (payload->crop_width && payload->crop_height) {
2268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            width = payload->crop_width;
2278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            height = (payload->crop_height >> mBobDeinterlace);
2288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        } else {
2298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            VTRACE("Invalid cropping width or height");
2308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            payload->crop_width = width;
2318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            payload->crop_height = height;
2328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
2338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
2348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaCreateSurfacesWithAttribute(mVaDpy,
2368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             width,
2378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             height,
2388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             VA_RT_FORMAT_YUV420,
2398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             1,
2408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             surface,
2418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                             vaSurfaceAttrib);
2428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (vaStatus != VA_STATUS_SUCCESS) {
2438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("vaCreateSurfacesWithAttribute returns %d", vaStatus);
2448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("Attributes: target: %d, width: %d, height %d, bufferHeight %d, tiling %d",
2458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                isTarget, width, height, bufferHeight, payload->tiling);
2468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        *surface = 0;
2478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
2488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
2498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
2518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
2528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::startVA(VideoPayloadBuffer *payload, int transform)
2548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
2558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ret = true;
2568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAStatus vaStatus;
2578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAEntrypoint *entryPoint;
2588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAConfigAttrib attribDummy;
2598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int numEntryPoints;
2608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool supportVideoProcessing = false;
2618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int majorVer = 0, minorVer = 0;
2628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // VA will hold a copy of the param pointer, so local varialbe doesn't work
2648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaDpy = vaGetDisplay(&mDisplay);
2658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (NULL == mVaDpy) {
2668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("failed to get VADisplay");
2678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
2688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
2698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaInitialize(mVaDpy, &majorVer, &minorVer);
2718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaInitialize");
2728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    numEntryPoints = vaMaxNumEntrypoints(mVaDpy);
2748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (numEntryPoints <= 0) {
2768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("numEntryPoints value is invalid");
2778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
2788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
2798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    entryPoint = (VAEntrypoint*)malloc(sizeof(VAEntrypoint) * numEntryPoints);
2818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (NULL == entryPoint) {
2828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("failed to malloc memory for entryPoint");
2838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
2848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
2858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaQueryConfigEntrypoints(mVaDpy,
2878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                        VAProfileNone,
2888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                        entryPoint,
2898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                        &numEntryPoints);
2908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaQueryConfigEntrypoints");
2918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (int i = 0; i < numEntryPoints; i++)
2938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (entryPoint[i] == VAEntrypointVideoProc)
2948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            supportVideoProcessing = true;
2958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    free(entryPoint);
2978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    entryPoint = NULL;
2988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
2998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!supportVideoProcessing) {
3008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("VAEntrypointVideoProc is not supported");
3018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
3028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaCreateConfig(mVaDpy,
3058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              VAProfileNone,
3068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              VAEntrypointVideoProc,
3078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              &attribDummy,
3088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              0,
3098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              &mVaCfg);
3108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaCreateConfig");
3118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // create first target surface
3138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ret = createVaSurface(payload, transform, true);
3148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (ret == false) {
3158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("failed to create target surface with attribute");
3168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
3178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaCreateContext(mVaDpy,
3208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               mVaCfg,
3218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               payload->width,
3228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               payload->height,
3238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               0,
3248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               &mRotatedSurfaces[0],
3258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               1,
3268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                               &mVaCtx);
3278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaCreateContext");
3288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAProcFilterType filters[VAProcFilterCount];
3308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    unsigned int numFilters = VAProcFilterCount;
3318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaQueryVideoProcFilters(mVaDpy, mVaCtx, filters, &numFilters);
3328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaQueryVideoProcFilters");
3338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool supportVideoProcFilter = false;
3358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (unsigned int j = 0; j < numFilters; j++)
3368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (filters[j] == VAProcFilterNone)
3378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            supportVideoProcFilter = true;
3388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!supportVideoProcFilter) {
3408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("VAProcFilterNone is not supported");
3418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
3428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAProcFilterParameterBuffer filter;
3458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    filter.type = VAProcFilterNone;
3468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    filter.value = 0;
3478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaCreateBuffer(mVaDpy,
3498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              mVaCtx,
3508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              VAProcFilterParameterBufferType,
3518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              sizeof(filter),
3528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              1,
3538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              &filter,
3548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                              &mVaBufFilter);
3558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaCreateBuffer");
3568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAProcPipelineCaps pipelineCaps;
3588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    unsigned int numCaps = 1;
3598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    vaStatus = vaQueryVideoProcPipelineCaps(mVaDpy,
3608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                            mVaCtx,
3618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                            &mVaBufFilter,
3628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                            numCaps,
3638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                            &pipelineCaps);
3648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    CHECK_VA_STATUS_RETURN("vaQueryVideoProcPipelineCaps");
3658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!(pipelineCaps.rotation_flags & (1 << transFromHalToVa(transform)))) {
3678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ETRACE("VA_ROTATION_xxx: 0x%08x is not supported by the filter",
3688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol             transFromHalToVa(transform));
3698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
3708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaInitialized = true;
3738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
3758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
3768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::setupRotationBuffer(VideoPayloadBuffer *payload, int transform)
3788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
3798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE
3808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    uint32_t setup_Begin = getMilliseconds();
3818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif
3828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAStatus vaStatus;
3838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int stride;
3848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ret = false;
3858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (payload->format != VA_FOURCC_NV12 || payload->width == 0 || payload->height == 0) {
3878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        WTRACE("payload data is not correct: format %#x, width %d, height %d",
3888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            payload->format, payload->width, payload->height);
3898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return ret;
3908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (payload->width > 1280 && payload->width <= 2048) {
3938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        payload->tiling = 1;
3948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
3958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
3968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    do {
3978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (isContextChanged(payload->width, payload->height, transform)) {
3988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            DTRACE("VA is restarted as rotation context changes");
3998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            if (mVaInitialized) {
4018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                stopVA(); // need to re-initialize VA for new rotation config
4028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            }
4038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            mTransform = transform;
4048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            mWidth = payload->width;
4058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            mHeight = payload->height;
4068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
4078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (!mVaInitialized) {
4098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ret = startVA(payload, transform);
4108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            if (ret == false) {
4118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
4128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                break;
4138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            }
4148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
4158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // start to create next target surface
4178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (!mRotatedSurfaces[mTargetIndex]) {
4188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ret = createVaSurface(payload, transform, true);
4198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            if (ret == false) {
4208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                ETRACE("failed to create target surface with attribute");
4218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
4228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                break;
4238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            }
4248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
4258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // create source surface
4278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ret = createVaSurface(payload, transform, false);
4288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (ret == false) {
4298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ETRACE("failed to create source surface with attribute");
4308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
4318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            break;
4328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
4338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE
4358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        uint32_t beginPicture = getMilliseconds();
4368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif
4378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaBeginPicture(mVaDpy, mVaCtx, mRotatedSurfaces[mTargetIndex]);
4388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaBeginPicture");
4398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VABufferID pipelineBuf;
4418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        void *p;
4428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VAProcPipelineParameterBuffer *pipelineParam;
4438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaCreateBuffer(mVaDpy,
4448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  mVaCtx,
4458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  VAProcPipelineParameterBufferType,
4468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  sizeof(*pipelineParam),
4478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  1,
4488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  NULL,
4498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                                  &pipelineBuf);
4508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaCreateBuffer");
4518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaMapBuffer(mVaDpy, pipelineBuf, &p);
4538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaMapBuffer");
4548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam = (VAProcPipelineParameterBuffer*)p;
4568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->surface = mSourceSurface;
4578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->rotation_state = transFromHalToVa(transform);
4588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->filters = &mVaBufFilter;
4598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->num_filters = 1;
4608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->surface_region = NULL;
4618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->output_region = NULL;
4628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->num_forward_references = 0;
4638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        pipelineParam->num_backward_references = 0;
4648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaUnmapBuffer(mVaDpy, pipelineBuf);
4658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaUnmapBuffer");
4668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaRenderPicture(mVaDpy, mVaCtx, &pipelineBuf, 1);
4688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaRenderPicture");
4698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaEndPicture(mVaDpy, mVaCtx);
4718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaEndPicture");
4728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaSyncSurface(mVaDpy, mRotatedSurfaces[mTargetIndex]);
4748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        CHECK_VA_STATUS_BREAK("vaSyncSurface");
4758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE
4778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        ITRACE("time spent %dms from vaBeginPicture to vaSyncSurface",
4788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol             getMilliseconds() - beginPicture);
4798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif
4808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // Populate payload fields so that overlayPlane can flip the buffer
4828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        payload->rotated_width = mRotatedStride;
4838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        payload->rotated_height = mRotatedHeight;
4848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        payload->rotated_buffer_handle = mKhandles[mTargetIndex];
4858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        // setting client transform to 0 to force re-generating rotated buffer whenever needed.
4868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        payload->client_transform = 0;
4878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mTargetIndex++;
4888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (mTargetIndex >= MAX_SURFACE_NUM)
4898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            mTargetIndex = 0;
4908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } while (0);
4928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifdef DEBUG_ROTATION_PERFROMANCE
4948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ITRACE("time spent %dms for setupRotationBuffer",
4958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol         getMilliseconds() - setup_Begin);
4968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif
4978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
4988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (mSourceSurface > 0) {
4998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaStatus = vaDestroySurfaces(mVaDpy, &mSourceSurface, 1);
5008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (vaStatus != VA_STATUS_SUCCESS)
5018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            WTRACE("vaDestroySurfaces failed, vaStatus = %d", vaStatus);
5028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mSourceSurface = 0;
5038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (vaStatus != VA_STATUS_SUCCESS) {
5068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        stopVA();
5078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false; // To not block HWC, just abort instead of retry
5088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (!payload->khandle) {
5118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        WTRACE("khandle is reset by decoder, surface is invalid!");
5128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
5138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
5168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
5178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::prepareBufferInfo(int w, int h, int stride, VideoPayloadBuffer *payload, void *user_pt)
5198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
5208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    int chroma_offset, size;
5218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    void *buf = NULL;
5228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->width = payload->crop_width = w;
5248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->height = payload->crop_height = h;
5258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->coded_width = ((w + 0xf) & ~0xf);
5268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->coded_height = ((h + 0xf) & ~0xf);
5278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->format = VA_FOURCC_NV12;
5288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->tiling = 1;
5298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->luma_stride = stride;
5308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->chroma_u_stride = stride;
5318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->chroma_v_stride = stride;
5328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->client_transform = 0;
5338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->bob_deinterlace = 0;
5348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    chroma_offset = stride * h;
5368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    size = stride * h + stride * h / 2;
5378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    ssize_t index;
5398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    index = mTTMWrappers.indexOfKey((uint64_t)user_pt);
5408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (index < 0) {
5418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VTRACE("wrapped userPt as wsbm buffer");
5428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        bool ret = mWsbm->allocateTTMBufferUB(size, 0, &buf, user_pt);
5438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (ret == false) {
5448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ETRACE("failed to allocate TTM buffer");
5458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            return ret;
5468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
5478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (mTTMWrappers.size() >= TTM_WRAPPER_COUNT) {
5498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            WTRACE("mTTMWrappers is unexpectedly full. Invalidate caches");
5508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            invalidateCaches();
5518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
5528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        index = mTTMWrappers.add((uint64_t)user_pt, buf);
5548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    } else {
5558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        VTRACE("got wsbmBuffer in saved caches");
5568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        buf = mTTMWrappers.valueAt(index);
5578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    payload->khandle = (buffer_handle_t) mWsbm->getKBufHandle(buf);
5608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
5618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
5628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::freeVaSurfaces()
5648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
5658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    bool ret;
5668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    VAStatus vaStatus;
5678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (int i = 0; i < MAX_SURFACE_NUM; i++) {
5698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (NULL != mDrmBuf[i]) {
5708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            ret = mWsbm->destroyTTMBuffer(mDrmBuf[i]);
5718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            if (!ret)
5728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                WTRACE("failed to free TTMBuffer");
5738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            mDrmBuf[i] = NULL;
5748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
5758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // remove wsbm buffer ref from VA
5788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (int j = 0; j < MAX_SURFACE_NUM; j++) {
5798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        if (0 != mRotatedSurfaces[j]) {
5808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            vaStatus = vaDestroySurfaces(mVaDpy, &mRotatedSurfaces[j], 1);
5818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol            if (vaStatus != VA_STATUS_SUCCESS)
5828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol                WTRACE("vaDestroySurfaces failed, vaStatus = %d", vaStatus);
5838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        }
5848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedSurfaces[j] = 0;
5858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
5868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
5878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolvoid RotationBufferProvider::stopVA()
5898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
5908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    freeVaSurfaces();
5918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
5928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (0 != mVaBufFilter)
5938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaDestroyBuffer(mVaDpy, mVaBufFilter);
5948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (0 != mVaCfg)
5958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaDestroyConfig(mVaDpy,mVaCfg);
5968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (0 != mVaCtx)
5978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaDestroyContext(mVaDpy, mVaCtx);
5988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (0 != mVaDpy)
5998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        vaTerminate(mVaDpy);
6008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaInitialized = false;
6028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    for (int i = 0; i < MAX_SURFACE_NUM; i++) {
6048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mKhandles[i] = 0;
6058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mRotatedSurfaces[i] = 0;
6068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        mDrmBuf[i] = NULL;
6078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
6088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // reset VA variable
6098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaDpy = 0;
6108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaCfg = 0;
6118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaCtx = 0;
6128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mVaBufFilter = 0;
6138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mSourceSurface = 0;
6148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mWidth = 0;
6168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mHeight = 0;
6178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mRotatedWidth = 0;
6188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mRotatedHeight = 0;
6198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mRotatedStride = 0;
6208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mTargetIndex = 0;
6218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    mBobDeinterlace = 0;
6228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
6238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolbool RotationBufferProvider::isContextChanged(int width, int height, int transform)
6258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol{
6268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    // check rotation config
6278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    if (height == mHeight &&
6288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        width == mWidth &&
6298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        transform == mTransform) {
6308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol        return false;
6318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    }
6328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol    return true;
6348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}
6358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol
6368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // name space intel
6378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // name space android
638