blob: c58c7f369b16cacf6adbed1fd60470de613f4597 [file] [log] [blame]
/*
* Copyright 2023 Rive
*/
#include "rive/pls/gl/load_store_actions_ext.hpp"
#include "shaders/out/generated/pls_load_store_ext.glsl.hpp"
namespace rive::pls
{
LoadStoreActionsEXT BuildLoadActionsEXT(const pls::FlushDescriptor& desc,
std::array<float, 4>* clearColor4f)
{
LoadStoreActionsEXT actions = LoadStoreActionsEXT::clearCoverage;
if (desc.colorLoadAction == LoadAction::clear)
{
UnpackColorToRGBA32F(desc.clearColor, clearColor4f->data());
actions |= LoadStoreActionsEXT::clearColor;
}
else if (desc.colorLoadAction == LoadAction::preserveRenderTarget)
{
actions |= LoadStoreActionsEXT::loadColor;
}
if (desc.combinedShaderFeatures & pls::ShaderFeatures::ENABLE_CLIPPING)
{
actions |= LoadStoreActionsEXT::clearClip;
}
return actions;
}
std::ostream& BuildLoadStoreEXTGLSL(std::ostream& shader, LoadStoreActionsEXT actions)
{
auto addDefine = [&shader](const char* name) { shader << "#define " << name << "\n"; };
if (actions & LoadStoreActionsEXT::clearColor)
{
addDefine(GLSL_CLEAR_COLOR);
}
if (actions & LoadStoreActionsEXT::loadColor)
{
addDefine(GLSL_LOAD_COLOR);
}
if (actions & LoadStoreActionsEXT::storeColor)
{
addDefine(GLSL_STORE_COLOR);
}
if (actions & LoadStoreActionsEXT::clearCoverage)
{
addDefine(GLSL_CLEAR_COVERAGE);
}
if (actions & LoadStoreActionsEXT::clearClip)
{
addDefine(GLSL_CLEAR_CLIP);
}
shader << pls::glsl::pls_load_store_ext;
return shader;
}
} // namespace rive::pls