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

Commit ac09e45a authored by John Reck's avatar John Reck
Browse files

Make sdr white point do a thing

Bug: 182312559
Test: SilkFX prototype changes

Change-Id: Ieca0e4c8e2229d14aac460945702d23759d208e9
parent 3bbb2aee
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -1233,8 +1233,10 @@ status_t GLESRenderEngine::drawLayers(const DisplaySettings& display,
            }
            }
        }
        }


        mState.maxMasteringLuminance = layer->source.buffer.maxMasteringLuminance;
        // Ensure luminance is at least 100 nits to avoid div-by-zero
        mState.maxContentLuminance = layer->source.buffer.maxContentLuminance;
        const float maxLuminance = std::max(100.f, layer->source.buffer.maxLuminanceNits);
        mState.maxMasteringLuminance = maxLuminance;
        mState.maxContentLuminance = maxLuminance;
        mState.projectionMatrix = projectionMatrix * layer->geometry.positionTransform;
        mState.projectionMatrix = projectionMatrix * layer->geometry.positionTransform;


        const FloatRect bounds = layer->geometry.boundaries;
        const FloatRect bounds = layer->geometry.boundaries;
+3 −0
Original line number Original line Diff line number Diff line
@@ -60,6 +60,9 @@ struct DisplaySettings {
    // capture of a device in landscape while the buffer is in portrait
    // capture of a device in landscape while the buffer is in portrait
    // orientation.
    // orientation.
    uint32_t orientation = ui::Transform::ROT_0;
    uint32_t orientation = ui::Transform::ROT_0;

    // SDR white point, -1f if unknown
    float sdrWhitePointNits = -1.f;
};
};


static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) {
static inline bool operator==(const DisplaySettings& lhs, const DisplaySettings& rhs) {
+4 −6
Original line number Original line Diff line number Diff line
@@ -64,8 +64,8 @@ struct Buffer {


    // HDR color-space setting for Y410.
    // HDR color-space setting for Y410.
    bool isY410BT2020 = false;
    bool isY410BT2020 = false;
    float maxMasteringLuminance = 0.0;

    float maxContentLuminance = 0.0;
    float maxLuminanceNits = 0.0;
};
};


// Metadata describing the layer geometry.
// Metadata describing the layer geometry.
@@ -175,8 +175,7 @@ static inline bool operator==(const Buffer& lhs, const Buffer& rhs) {
            lhs.textureTransform == rhs.textureTransform &&
            lhs.textureTransform == rhs.textureTransform &&
            lhs.usePremultipliedAlpha == rhs.usePremultipliedAlpha &&
            lhs.usePremultipliedAlpha == rhs.usePremultipliedAlpha &&
            lhs.isOpaque == rhs.isOpaque && lhs.isY410BT2020 == rhs.isY410BT2020 &&
            lhs.isOpaque == rhs.isOpaque && lhs.isY410BT2020 == rhs.isY410BT2020 &&
            lhs.maxMasteringLuminance == rhs.maxMasteringLuminance &&
            lhs.maxLuminanceNits == rhs.maxLuminanceNits;
            lhs.maxContentLuminance == rhs.maxContentLuminance;
}
}


static inline bool operator==(const Geometry& lhs, const Geometry& rhs) {
static inline bool operator==(const Geometry& lhs, const Geometry& rhs) {
@@ -237,8 +236,7 @@ static inline void PrintTo(const Buffer& settings, ::std::ostream* os) {
    *os << "\n    .usePremultipliedAlpha = " << settings.usePremultipliedAlpha;
    *os << "\n    .usePremultipliedAlpha = " << settings.usePremultipliedAlpha;
    *os << "\n    .isOpaque = " << settings.isOpaque;
    *os << "\n    .isOpaque = " << settings.isOpaque;
    *os << "\n    .isY410BT2020 = " << settings.isY410BT2020;
    *os << "\n    .isY410BT2020 = " << settings.isY410BT2020;
    *os << "\n    .maxMasteringLuminance = " << settings.maxMasteringLuminance;
    *os << "\n    .maxLuminanceNits = " << settings.maxLuminanceNits;
    *os << "\n    .maxContentLuminance = " << settings.maxContentLuminance;
    *os << "\n}";
    *os << "\n}";
}
}


+2 −4
Original line number Original line Diff line number Diff line
@@ -108,8 +108,7 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting
            .source = PixelSource{.buffer =
            .source = PixelSource{.buffer =
                                          Buffer{
                                          Buffer{
                                                  .buffer = srcTexture,
                                                  .buffer = srcTexture,
                                                  .maxMasteringLuminance = 1000.f,
                                                  .maxLuminanceNits = 1000.f,
                                                  .maxContentLuminance = 1000.f,
                                          }},
                                          }},
    };
    };


@@ -205,8 +204,7 @@ static void drawTextureScaleLayers(SkiaRenderEngine* renderengine, const Display
            .source = PixelSource{.buffer =
            .source = PixelSource{.buffer =
                                          Buffer{
                                          Buffer{
                                                  .buffer = srcTexture,
                                                  .buffer = srcTexture,
                                                  .maxMasteringLuminance = 1000.f,
                                                  .maxLuminanceNits = 1000.f,
                                                  .maxContentLuminance = 1000.f,
                                                  .textureTransform = kScaleYOnly,
                                                  .textureTransform = kScaleYOnly,
                                          }},
                                          }},
            .sourceDataspace = kOtherDataSpace,
            .sourceDataspace = kOtherDataSpace,
+10 −4
Original line number Original line Diff line number Diff line
@@ -567,10 +567,14 @@ sk_sp<SkShader> SkiaGLRenderEngine::createRuntimeEffectShader(sk_sp<SkShader> sh
        } else {
        } else {
            runtimeEffect = effectIter->second;
            runtimeEffect = effectIter->second;
        }
        }
        float maxLuminance = layer->source.buffer.maxLuminanceNits;
        // If the buffer doesn't have a max luminance, treat it as SDR & use the display's SDR
        // white point
        if (maxLuminance <= 0.f) {
            maxLuminance = display.sdrWhitePointNits;
        }
        return createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform,
        return createLinearEffectShader(shader, effect, runtimeEffect, layer->colorTransform,
                                        display.maxLuminance,
                                        display.maxLuminance, maxLuminance);
                                        layer->source.buffer.maxMasteringLuminance,
                                        layer->source.buffer.maxContentLuminance);
    }
    }
    return shader;
    return shader;
}
}
@@ -866,7 +870,9 @@ status_t SkiaGLRenderEngine::drawLayers(const DisplaySettings& display,


        const bool requiresLinearEffect = layer->colorTransform != mat4() ||
        const bool requiresLinearEffect = layer->colorTransform != mat4() ||
                (mUseColorManagement &&
                (mUseColorManagement &&
                 needsToneMapping(layer->sourceDataspace, display.outputDataspace));
                 needsToneMapping(layer->sourceDataspace, display.outputDataspace)) ||
                (display.sdrWhitePointNits > 0.f &&
                 display.sdrWhitePointNits != display.maxLuminance);


        // quick abort from drawing the remaining portion of the layer
        // quick abort from drawing the remaining portion of the layer
        if (layer->alpha == 0 && !requiresLinearEffect && !layer->disableBlending &&
        if (layer->alpha == 0 && !requiresLinearEffect && !layer->disableBlending &&
Loading