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

Commit 8cf96525 authored by John Reck's avatar John Reck
Browse files

Fork RenderEngine

RenderEngine is going to undergo some evolution and
is at this point not interested in clients other
than SurfaceFlinger. Land a copy into stagefright so
it can continue with whatever it was doing.

As renderengine was a static library, this should have
no change on binary sizes.

Test: builds; no behavior changes otherwise
Bug: 167727943
Change-Id: Id69680e0c9558dac672f2fabbf4d2c268a8d0e64
parent f3a626fa
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -211,7 +211,7 @@ cc_library_shared {
    ],

    static_libs: [
        "librenderengine",
        "librenderfright",
    ],

    export_include_dirs: [
+111 −0
Original line number Diff line number Diff line
cc_defaults {
    name: "renderfright_defaults",
    cflags: [
        "-DLOG_TAG=\"renderfright\"",
        "-Wall",
        "-Werror",
        "-Wthread-safety",
        "-Wunused",
        "-Wunreachable-code",
    ],
}

cc_defaults {
    name: "librenderfright_defaults",
    defaults: ["renderfright_defaults"],
    cflags: [
        "-DGL_GLEXT_PROTOTYPES",
        "-DEGL_EGLEXT_PROTOTYPES",
    ],
    shared_libs: [
        "libbase",
        "libcutils",
        "libEGL",
        "libGLESv1_CM",
        "libGLESv2",
        "libgui",
        "liblog",
        "libnativewindow",
        "libprocessgroup",
        "libsync",
        "libui",
        "libutils",
    ],
    local_include_dirs: ["include"],
    export_include_dirs: ["include"],
}

filegroup {
    name: "librenderfright_sources",
    srcs: [
        "Description.cpp",
        "Mesh.cpp",
        "RenderEngine.cpp",
        "Texture.cpp",
    ],
}

filegroup {
    name: "librenderfright_gl_sources",
    srcs: [
        "gl/GLESRenderEngine.cpp",
        "gl/GLExtensions.cpp",
        "gl/GLFramebuffer.cpp",
        "gl/GLImage.cpp",
        "gl/GLShadowTexture.cpp",
        "gl/GLShadowVertexGenerator.cpp",
        "gl/GLSkiaShadowPort.cpp",
        "gl/GLVertexBuffer.cpp",
        "gl/ImageManager.cpp",
        "gl/Program.cpp",
        "gl/ProgramCache.cpp",
        "gl/filters/BlurFilter.cpp",
        "gl/filters/GenericProgram.cpp",
    ],
}

filegroup {
    name: "librenderfright_threaded_sources",
    srcs: [
        "threaded/RenderEngineThreaded.cpp",
    ],
}

cc_library_static {
    name: "librenderfright",
    defaults: ["librenderfright_defaults"],
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    double_loadable: true,
    clang: true,
    cflags: [
        "-fvisibility=hidden",
        "-Werror=format",
    ],
    srcs: [
        ":librenderfright_sources",
        ":librenderfright_gl_sources",
        ":librenderfright_threaded_sources",
    ],
    lto: {
        thin: true,
    },
}

cc_library_static {
    name: "librenderfright_mocks",
    defaults: ["librenderfright_defaults"],
    srcs: [
        "mock/Framebuffer.cpp",
        "mock/Image.cpp",
        "mock/RenderEngine.cpp",
    ],
    static_libs: [
        "libgtest",
        "libgmock",
    ],
    local_include_dirs: ["include"],
    export_include_dirs: ["include"],
}
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <renderengine/private/Description.h>

#include <stdint.h>

#include <utils/TypeHelpers.h>

namespace android {
namespace renderengine {

Description::TransferFunction Description::dataSpaceToTransferFunction(ui::Dataspace dataSpace) {
    ui::Dataspace transfer = static_cast<ui::Dataspace>(dataSpace & ui::Dataspace::TRANSFER_MASK);
    switch (transfer) {
        case ui::Dataspace::TRANSFER_ST2084:
            return Description::TransferFunction::ST2084;
        case ui::Dataspace::TRANSFER_HLG:
            return Description::TransferFunction::HLG;
        case ui::Dataspace::TRANSFER_LINEAR:
            return Description::TransferFunction::LINEAR;
        default:
            return Description::TransferFunction::SRGB;
    }
}

bool Description::hasInputTransformMatrix() const {
    const mat4 identity;
    return inputTransformMatrix != identity;
}

bool Description::hasOutputTransformMatrix() const {
    const mat4 identity;
    return outputTransformMatrix != identity;
}

bool Description::hasColorMatrix() const {
    const mat4 identity;
    return colorMatrix != identity;
}

} // namespace renderengine
} // namespace android
+146 −0
Original line number Diff line number Diff line
/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <renderengine/Mesh.h>

#include <utils/Log.h>

namespace android {
namespace renderengine {

Mesh::Mesh(Primitive primitive, size_t vertexCount, size_t vertexSize, size_t texCoordSize,
           size_t cropCoordsSize, size_t shadowColorSize, size_t shadowParamsSize,
           size_t indexCount)
      : mVertexCount(vertexCount),
        mVertexSize(vertexSize),
        mTexCoordsSize(texCoordSize),
        mCropCoordsSize(cropCoordsSize),
        mShadowColorSize(shadowColorSize),
        mShadowParamsSize(shadowParamsSize),
        mPrimitive(primitive),
        mIndexCount(indexCount) {
    if (vertexCount == 0) {
        mVertices.resize(1);
        mVertices[0] = 0.0f;
        mStride = 0;
        return;
    }
    size_t stride = vertexSize + texCoordSize + cropCoordsSize + shadowColorSize + shadowParamsSize;
    size_t remainder = (stride * vertexCount) / vertexCount;
    // Since all of the input parameters are unsigned, if stride is less than
    // either vertexSize or texCoordSize, it must have overflowed. remainder
    // will be equal to stride as long as stride * vertexCount doesn't overflow.
    if ((stride < vertexSize) || (remainder != stride)) {
        ALOGE("Overflow in Mesh(..., %zu, %zu, %zu, %zu, %zu, %zu)", vertexCount, vertexSize,
              texCoordSize, cropCoordsSize, shadowColorSize, shadowParamsSize);
        mVertices.resize(1);
        mVertices[0] = 0.0f;
        mVertexCount = 0;
        mVertexSize = 0;
        mTexCoordsSize = 0;
        mCropCoordsSize = 0;
        mShadowColorSize = 0;
        mShadowParamsSize = 0;
        mStride = 0;
        return;
    }

    mVertices.resize(stride * vertexCount);
    mStride = stride;
    mIndices.resize(indexCount);
}

Mesh::Primitive Mesh::getPrimitive() const {
    return mPrimitive;
}

float const* Mesh::getPositions() const {
    return mVertices.data();
}
float* Mesh::getPositions() {
    return mVertices.data();
}

float const* Mesh::getTexCoords() const {
    return mVertices.data() + mVertexSize;
}
float* Mesh::getTexCoords() {
    return mVertices.data() + mVertexSize;
}

float const* Mesh::getCropCoords() const {
    return mVertices.data() + mVertexSize + mTexCoordsSize;
}
float* Mesh::getCropCoords() {
    return mVertices.data() + mVertexSize + mTexCoordsSize;
}

float const* Mesh::getShadowColor() const {
    return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize;
}
float* Mesh::getShadowColor() {
    return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize;
}

float const* Mesh::getShadowParams() const {
    return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize + mShadowColorSize;
}
float* Mesh::getShadowParams() {
    return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize + mShadowColorSize;
}

uint16_t const* Mesh::getIndices() const {
    return mIndices.data();
}

uint16_t* Mesh::getIndices() {
    return mIndices.data();
}

size_t Mesh::getVertexCount() const {
    return mVertexCount;
}

size_t Mesh::getVertexSize() const {
    return mVertexSize;
}

size_t Mesh::getTexCoordsSize() const {
    return mTexCoordsSize;
}

size_t Mesh::getShadowColorSize() const {
    return mShadowColorSize;
}

size_t Mesh::getShadowParamsSize() const {
    return mShadowParamsSize;
}

size_t Mesh::getByteStride() const {
    return mStride * sizeof(float);
}

size_t Mesh::getStride() const {
    return mStride;
}

size_t Mesh::getIndexCount() const {
    return mIndexCount;
}

} // namespace renderengine
} // namespace android
+71 −0
Original line number Diff line number Diff line
/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <renderengine/RenderEngine.h>

#include <cutils/properties.h>
#include <log/log.h>
#include <private/gui/SyncFeatures.h>
#include "gl/GLESRenderEngine.h"
#include "threaded/RenderEngineThreaded.h"

namespace android {
namespace renderengine {

std::unique_ptr<RenderEngine> RenderEngine::create(const RenderEngineCreationArgs& args) {
    RenderEngineType renderEngineType = args.renderEngineType;

    // Keep the ability to override by PROPERTIES:
    char prop[PROPERTY_VALUE_MAX];
    property_get(PROPERTY_DEBUG_RENDERENGINE_BACKEND, prop, "");
    if (strcmp(prop, "gles") == 0) {
        renderEngineType = RenderEngineType::GLES;
    }
    if (strcmp(prop, "threaded") == 0) {
        renderEngineType = RenderEngineType::THREADED;
    }

    switch (renderEngineType) {
        case RenderEngineType::THREADED:
            ALOGD("Threaded RenderEngine with GLES Backend");
            return renderengine::threaded::RenderEngineThreaded::create(
                    [args]() { return android::renderengine::gl::GLESRenderEngine::create(args); });
        case RenderEngineType::GLES:
        default:
            ALOGD("RenderEngine with GLES Backend");
            return renderengine::gl::GLESRenderEngine::create(args);
    }
}

RenderEngine::~RenderEngine() = default;

namespace impl {

RenderEngine::RenderEngine(const RenderEngineCreationArgs& args) : mArgs(args) {}

RenderEngine::~RenderEngine() = default;

bool RenderEngine::useNativeFenceSync() const {
    return SyncFeatures::getInstance().useNativeFenceSync();
}

bool RenderEngine::useWaitSync() const {
    return SyncFeatures::getInstance().useWaitSync();
}

} // namespace impl
} // namespace renderengine
} // namespace android
Loading