Jackson Gardner 8ae7b522dc
[skwasm] Add the capability of dumping live object counts in debug mode. (#168389)
This adds a debugging utility that allows us to dump counts of the live
skwasm objects in debug mode. This is useful for understanding memory
leaks.

This is not code that runs in production or affects end users, so I'm
not bothering to write specific unit tests for this functionality.

---------

Co-authored-by: Kevin Moore <kevmoo@users.noreply.github.com>
2025-05-16 17:07:53 +00:00

167 lines
5.9 KiB
C++

// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "export.h"
#include "helpers.h"
#include "live_objects.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/effects/SkGradientShader.h"
#include "third_party/skia/include/effects/SkRuntimeEffect.h"
#include "wrappers.h"
using namespace Skwasm;
SKWASM_EXPORT SkShader* shader_createLinearGradient(
SkPoint* endPoints, // Two points
SkColor* colors,
SkScalar* stops,
int count, // Number of stops/colors
SkTileMode tileMode,
SkScalar* matrix33 // Can be nullptr
) {
liveShaderCount++;
if (matrix33) {
SkMatrix localMatrix = createMatrix(matrix33);
return SkGradientShader::MakeLinear(endPoints, colors, stops, count,
tileMode, 0, &localMatrix)
.release();
} else {
return SkGradientShader::MakeLinear(endPoints, colors, stops, count,
tileMode)
.release();
}
}
SKWASM_EXPORT SkShader* shader_createRadialGradient(SkScalar centerX,
SkScalar centerY,
SkScalar radius,
SkColor* colors,
SkScalar* stops,
int count,
SkTileMode tileMode,
SkScalar* matrix33) {
liveShaderCount++;
if (matrix33) {
SkMatrix localMatrix = createMatrix(matrix33);
return SkGradientShader::MakeRadial({centerX, centerY}, radius, colors,
stops, count, tileMode, 0, &localMatrix)
.release();
} else {
return SkGradientShader::MakeRadial({centerX, centerY}, radius, colors,
stops, count, tileMode)
.release();
}
}
SKWASM_EXPORT SkShader* shader_createConicalGradient(
SkPoint* endPoints, // Two points
SkScalar startRadius,
SkScalar endRadius,
SkColor* colors,
SkScalar* stops,
int count,
SkTileMode tileMode,
SkScalar* matrix33) {
liveShaderCount++;
if (matrix33) {
SkMatrix localMatrix = createMatrix(matrix33);
return SkGradientShader::MakeTwoPointConical(
endPoints[0], startRadius, endPoints[1], endRadius, colors,
stops, count, tileMode, 0, &localMatrix)
.release();
} else {
return SkGradientShader::MakeTwoPointConical(endPoints[0], startRadius,
endPoints[1], endRadius,
colors, stops, count, tileMode)
.release();
}
}
SKWASM_EXPORT SkShader* shader_createSweepGradient(SkScalar centerX,
SkScalar centerY,
SkColor* colors,
SkScalar* stops,
int count,
SkTileMode tileMode,
SkScalar startAngle,
SkScalar endAngle,
SkScalar* matrix33) {
liveShaderCount++;
if (matrix33) {
SkMatrix localMatrix = createMatrix(matrix33);
return SkGradientShader::MakeSweep(centerX, centerY, colors, stops, count,
tileMode, startAngle, endAngle, 0,
&localMatrix)
.release();
} else {
return SkGradientShader::MakeSweep(centerX, centerY, colors, stops, count,
tileMode, startAngle, endAngle, 0,
nullptr)
.release();
}
}
SKWASM_EXPORT void shader_dispose(SkShader* shader) {
liveShaderCount--;
shader->unref();
}
SKWASM_EXPORT SkRuntimeEffect* runtimeEffect_create(SkString* source) {
liveRuntimeEffectCount++;
auto result = SkRuntimeEffect::MakeForShader(*source);
if (result.effect == nullptr) {
printf("Failed to compile shader. Error text:\n%s",
result.errorText.data());
return nullptr;
} else {
return result.effect.release();
}
}
SKWASM_EXPORT void runtimeEffect_dispose(SkRuntimeEffect* effect) {
liveRuntimeEffectCount--;
effect->unref();
}
SKWASM_EXPORT size_t runtimeEffect_getUniformSize(SkRuntimeEffect* effect) {
return effect->uniformSize();
}
SKWASM_EXPORT SkShader* shader_createRuntimeEffectShader(
SkRuntimeEffect* runtimeEffect,
SkData* uniforms,
SkShader** children,
size_t childCount) {
liveShaderCount++;
std::vector<sk_sp<SkShader>> childPointers;
for (size_t i = 0; i < childCount; i++) {
childPointers.emplace_back(sk_ref_sp<SkShader>(children[i]));
}
return runtimeEffect
->makeShader(sk_ref_sp<SkData>(uniforms), childPointers.data(),
childCount, nullptr)
.release();
}
SKWASM_EXPORT SkShader* shader_createFromImage(SkImage* image,
SkTileMode tileModeX,
SkTileMode tileModeY,
FilterQuality quality,
SkScalar* matrix33) {
liveShaderCount++;
if (matrix33) {
SkMatrix localMatrix = createMatrix(matrix33);
return image
->makeShader(tileModeX, tileModeY, samplingOptionsForQuality(quality),
&localMatrix)
.release();
} else {
return image
->makeShader(tileModeX, tileModeY, samplingOptionsForQuality(quality))
.release();
}
}