21 start_point_ = start_point;
22 end_point_ = end_point;
26 colors_ = std::move(colors);
30 stops_ = std::move(stops);
42 tile_mode_ = tile_mode;
49 for (
auto color : colors_) {
50 if (!color.IsOpaque()) {
61 return RenderSSBO(renderer, entity, pass);
63 return RenderTexture(renderer, entity, pass);
66 bool LinearGradientContents::RenderTexture(
const ContentContext& renderer,
73 auto gradient_texture =
75 if (gradient_texture ==
nullptr) {
79 FS::FragInfo frag_info;
80 frag_info.start_point = start_point_;
81 frag_info.end_point = end_point_;
82 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
83 frag_info.decal_border_color = decal_border_color_;
84 frag_info.texture_sampler_y_coord_scale = gradient_texture->GetYCoordScale();
86 frag_info.half_texel =
Vector2(0.5 / gradient_texture->GetSize().width,
87 0.5 / gradient_texture->GetSize().height);
89 auto geometry_result =
90 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
92 VS::FrameInfo frame_info;
93 frame_info.mvp = geometry_result.transform;
101 if (geometry_result.prevent_overdraw) {
105 options.primitive_type = geometry_result.type;
108 cmd.BindVertices(std::move(geometry_result.vertex_buffer));
110 SamplerDescriptor sampler_desc;
113 FS::BindTextureSampler(
114 cmd, std::move(gradient_texture),
115 renderer.
GetContext()->GetSamplerLibrary()->GetSampler(sampler_desc));
122 if (geometry_result.prevent_overdraw) {
123 auto restore = ClipRestoreContents();
125 return restore.Render(renderer, entity, pass);
130 bool LinearGradientContents::RenderSSBO(
const ContentContext& renderer,
131 const Entity& entity,
132 RenderPass& pass)
const {
136 FS::FragInfo frag_info;
137 frag_info.start_point = start_point_;
138 frag_info.end_point = end_point_;
139 frag_info.tile_mode =
static_cast<Scalar>(tile_mode_);
140 frag_info.decal_border_color = decal_border_color_;
143 auto& host_buffer = pass.GetTransientsBuffer();
146 frag_info.colors_length = colors.size();
148 host_buffer.Emplace(colors.data(), colors.size() *
sizeof(StopData),
151 VS::FrameInfo frame_info;
152 frame_info.mvp = pass.GetOrthographicTransform() * entity.GetTransform();
157 cmd.stencil_reference = entity.GetClipDepth();
159 auto geometry_result =
160 GetGeometry()->GetPositionBuffer(renderer, entity, pass);
162 if (geometry_result.prevent_overdraw) {
166 options.primitive_type = geometry_result.type;
167 cmd.pipeline = renderer.GetLinearGradientSSBOFillPipeline(options);
169 cmd.BindVertices(std::move(geometry_result.vertex_buffer));
170 FS::BindFragInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frag_info));
171 FS::BindColorData(cmd, color_buffer);
172 VS::BindFrameInfo(cmd, pass.GetTransientsBuffer().EmplaceUniform(frame_info));
174 if (!pass.AddCommand(std::move(cmd))) {
178 if (geometry_result.prevent_overdraw) {
179 auto restore = ClipRestoreContents();
181 return restore.Render(renderer, entity, pass);
188 for (
Color& color : colors_) {
189 color = color_filter_proc(color);
191 decal_border_color_ = color_filter_proc(decal_border_color_);