Add generic uniform setter function to SkRuntimeShaderBuilder
Change-Id: Idab539a4b39fe5ceab54948c99c0dcd6d19fd345 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/352743 Commit-Queue: Derek Sollenberger <djsollen@google.com> Auto-Submit: Derek Sollenberger <djsollen@google.com> Reviewed-by: Brian Osman <brianosman@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
This commit is contained in:
parent
3d81fdcbd2
commit
9e1cedda63
@ -222,6 +222,22 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool set(const T val[], const int count) {
|
||||
static_assert(std::is_trivially_copyable<T>::value, "Value must be trivial copyable");
|
||||
if (!fVar) {
|
||||
SkDEBUGFAIL("Assigning to missing variable");
|
||||
return false;
|
||||
} else if (sizeof(T) * count != fVar->sizeInBytes()) {
|
||||
SkDEBUGFAIL("Incorrect value size");
|
||||
return false;
|
||||
} else {
|
||||
memcpy(SkTAddOffset<void>(fOwner->writableUniformData(), fVar->fOffset),
|
||||
val, sizeof(T) * count);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
SkRuntimeShaderBuilder* fOwner;
|
||||
const SkRuntimeEffect::Uniform* fVar; // nullptr if the variable was not found
|
||||
};
|
||||
|
@ -334,6 +334,35 @@ DEF_TEST(SkRuntimeShaderBuilderReuse, r) {
|
||||
auto shader_1 = b.makeShader(nullptr, true);
|
||||
}
|
||||
|
||||
DEF_TEST(SkRuntimeShaderBuilderSetUniforms, r) {
|
||||
const char* kSource = R"(
|
||||
uniform half x;
|
||||
uniform vec2 offset;
|
||||
half4 main() { return half4(x); }
|
||||
)";
|
||||
|
||||
sk_sp<SkRuntimeEffect> effect = std::get<0>(SkRuntimeEffect::Make(SkString(kSource)));
|
||||
REPORTER_ASSERT(r, effect);
|
||||
|
||||
SkRuntimeShaderBuilder b(std::move(effect));
|
||||
|
||||
// Test passes if this sequence doesn't assert.
|
||||
float x = 1.0f;
|
||||
REPORTER_ASSERT(r, b.uniform("x").set(&x, 1));
|
||||
|
||||
// add extra value to ensure that set doesn't try to use sizeof(array)
|
||||
float origin[] = { 2.0f, 3.0f, 4.0f };
|
||||
REPORTER_ASSERT(r, b.uniform("offset").set<float>(origin, 2));
|
||||
|
||||
#ifndef SK_DEBUG
|
||||
REPORTER_ASSERT(r, !b.uniform("offset").set<float>(origin, 1));
|
||||
REPORTER_ASSERT(r, !b.uniform("offset").set<float>(origin, 3));
|
||||
#endif
|
||||
|
||||
|
||||
auto shader = b.makeShader(nullptr, false);
|
||||
}
|
||||
|
||||
DEF_TEST(SkRuntimeEffectThreaded, r) {
|
||||
// SkRuntimeEffect uses a single compiler instance, but it's mutex locked.
|
||||
// This tests that we can safely use it from more than one thread, and also
|
||||
|
Loading…
Reference in New Issue
Block a user