Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fee0648 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

fix[2228133] pixelflinger ignores the "vertical stride" leading to artifacts...

fix[2228133] pixelflinger ignores the "vertical stride" leading to artifacts when playing back video

we lost the concept of vertical stride when moving video playback to EGLImage.
Here we bring it back in a somewhat hacky-way that will work only for the
softgl/mdp backend.
parent aa628c91
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@
#include <GLES/gl.h>
#include <GLES/glext.h>

struct android_native_buffer_t;

namespace android {

const unsigned int OGLES_NUM_COMPRESSED_TEXTURE_FORMATS = 10;
@@ -602,7 +604,7 @@ struct copybits_context_t {
    copybit_device_t*       blitEngine;
    int32_t                 minScale;
    int32_t                 maxScale;
    buffer_handle_t         drawSurfaceBuffer;
    android_native_buffer_t* drawSurfaceBuffer;
};

struct ogles_context_t {
+2 −0
Original line number Diff line number Diff line
@@ -93,6 +93,8 @@ public:
    
    void setIndex(int index);
    int getIndex() const;
    void setVerticalStride(uint32_t vstride);
    uint32_t getVerticalStride() const;

protected:
    GraphicBuffer(const Parcel& reply);
+2 −0
Original line number Diff line number Diff line
@@ -444,6 +444,8 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
                GraphicBuffer::USAGE_HW_TEXTURE,
                src.img.w, src.img.handle, false);

        graphicBuffer->setVerticalStride(src.img.h);

        err = mLayer.initializeEglImage(graphicBuffer, &mTexture);
    }
#endif
+8 −0
Original line number Diff line number Diff line
@@ -226,6 +226,14 @@ int GraphicBuffer::getIndex() const {
    return mIndex;
}

void GraphicBuffer::setVerticalStride(uint32_t vstride) {
    mVStride = vstride;
}

uint32_t GraphicBuffer::getVerticalStride() const {
    return mVStride;
}

// ---------------------------------------------------------------------------

}; // namespace android
+18 −7
Original line number Diff line number Diff line
@@ -46,13 +46,24 @@ namespace android {

static void textureToCopyBitImage(
        const GGLSurface* surface, int32_t opFormat, 
        buffer_handle_t buffer, copybit_image_t* img) 
        android_native_buffer_t* buffer, copybit_image_t* img)
{
    uint32_t vstride = 0;
    if (opFormat == COPYBIT_FORMAT_YCbCr_422_SP ||
            opFormat == COPYBIT_FORMAT_YCbCr_420_SP) {
        // NOTE: this static_cast is really not safe b/c we can't know for
        // sure the buffer passed is of the right type.
        // However, since we do this only for YUV formats, we should be safe
        // since only SurfaceFlinger makes use of them.
        GraphicBuffer* graphicBuffer = static_cast<GraphicBuffer*>(buffer);
        vstride = graphicBuffer->getVerticalStride();
    }

    img->w      = surface->stride;
    img->h      = surface->height;
    img->h      = vstride ? vstride : surface->height;
    img->format = opFormat;
    img->base   = surface->data;
    img->handle = (native_handle_t *)buffer;
    img->handle = (native_handle_t *)buffer->handle;
}

struct clipRectRegion : public copybit_region_t {
@@ -279,8 +290,8 @@ static bool copybit(GLint x, GLint y,

    copybit_device_t* copybit = c->copybits.blitEngine;
    copybit_image_t src;
    buffer_handle_t source_hnd = textureObject->buffer->handle;
    textureToCopyBitImage(&textureObject->surface, opFormat, source_hnd, &src);
    textureToCopyBitImage(&textureObject->surface, opFormat,
            textureObject->buffer, &src);
    copybit_rect_t srect = { Ucr, Vcr + Hcr, Ucr + Wcr, Vcr };

    /*
@@ -360,8 +371,8 @@ static bool copybit(GLint x, GLint y,
    }

    copybit_image_t dst;
    buffer_handle_t target_hnd = c->copybits.drawSurfaceBuffer;
    textureToCopyBitImage(&cbSurface, cbSurface.format, target_hnd, &dst);
    textureToCopyBitImage(&cbSurface, cbSurface.format,
            c->copybits.drawSurfaceBuffer, &dst);
    copybit_rect_t drect = {x, y, x+w, y+h};


Loading