Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
flutter::FragmentProgram Class Reference

#include <fragment_program.h>

Inheritance diagram for flutter::FragmentProgram:
flutter::RefCountedDartWrappable< FragmentProgram > fml::RefCountedThreadSafe< T > tonic::DartWrappable fml::internal::RefCountedThreadSafeBase

Public Member Functions

 ~FragmentProgram () override
 
std::string initFromAsset (const std::string &asset_name)
 
fml::RefPtr< FragmentShader > shader (Dart_Handle shader, Dart_Handle uniforms_handle, Dart_Handle samplers)
 
std::shared_ptr< DlColorSourceMakeDlColorSource (std::shared_ptr< std::vector< uint8_t > > float_uniforms, const std::vector< std::shared_ptr< DlColorSource > > &children)
 
std::shared_ptr< DlImageFilterMakeDlImageFilter (std::shared_ptr< std::vector< uint8_t > > float_uniforms, const std::vector< std::shared_ptr< DlColorSource > > &children)
 
- Public Member Functions inherited from flutter::RefCountedDartWrappable< FragmentProgram >
virtual void RetainDartWrappableReference () const override
 
virtual void ReleaseDartWrappableReference () const override
 
- Public Member Functions inherited from fml::RefCountedThreadSafe< T >
void Release () const
 
- Public Member Functions inherited from fml::internal::RefCountedThreadSafeBase
void AddRef () const
 
bool HasOneRef () const
 
void AssertHasOneRef () const
 
- Public Member Functions inherited from tonic::DartWrappable
 DartWrappable ()
 
virtual const DartWrapperInfoGetDartWrapperInfo () const =0
 
Dart_Handle CreateDartWrapper (DartState *dart_state)
 
void AssociateWithDartWrapper (Dart_Handle wrappable)
 
void ClearDartWrapper ()
 
Dart_WeakPersistentHandle dart_wrapper () const
 

Static Public Member Functions

static void Create (Dart_Handle wrapper)
 

Additional Inherited Members

- Public Types inherited from tonic::DartWrappable
enum  DartNativeFields {
  kPeerIndex ,
  kNumberOfNativeFields
}
 
- Protected Member Functions inherited from fml::RefCountedThreadSafe< T >
 RefCountedThreadSafe ()
 
 ~RefCountedThreadSafe ()
 
- Protected Member Functions inherited from fml::internal::RefCountedThreadSafeBase
 RefCountedThreadSafeBase ()
 
 ~RefCountedThreadSafeBase ()
 
bool Release () const
 
void Adopt ()
 
- Protected Member Functions inherited from tonic::DartWrappable
virtual ~DartWrappable ()
 
- Static Protected Member Functions inherited from tonic::DartWrappable
static Dart_PersistentHandle GetTypeForWrapper (tonic::DartState *dart_state, const tonic::DartWrapperInfo &wrapper_info)
 

Detailed Description

Definition at line 24 of file fragment_program.h.

Constructor & Destructor Documentation

◆ ~FragmentProgram()

flutter::FragmentProgram::~FragmentProgram ( )
overridedefault

Member Function Documentation

◆ Create()

void flutter::FragmentProgram::Create ( Dart_Handle  wrapper)
static

Definition at line 272 of file fragment_program.cc.

272 {
273 auto res = fml::MakeRefCounted<FragmentProgram>();
274 res->AssociateWithDartWrapper(wrapper);
275}

◆ initFromAsset()

std::string flutter::FragmentProgram::initFromAsset ( const std::string &  asset_name)

Definition at line 131 of file fragment_program.cc.

131 {
132 FML_TRACE_EVENT("flutter", "FragmentProgram::initFromAsset", "asset",
133 asset_name);
134 UIDartState* ui_dart_state = UIDartState::Current();
135 std::shared_ptr<AssetManager> asset_manager =
136 ui_dart_state->platform_configuration()->client()->GetAssetManager();
137
138 std::unique_ptr<fml::Mapping> data = asset_manager->GetAsMapping(asset_name);
139 if (data == nullptr) {
140 return std::string("Asset '") + asset_name + std::string("' not found");
141 }
142
143 auto runtime_stages =
145
146 if (!runtime_stages.ok()) {
147 return std::string("Asset '") + asset_name +
148 std::string("' manifest could not be decoded: ") +
149 runtime_stages.status().ToString();
150 }
151
152 if (runtime_stages->empty()) {
153 return std::string("Asset '") + asset_name +
154 std::string("' does not contain any shader data.");
155 }
156
158 ui_dart_state->GetRuntimeStageBackend();
159 std::shared_ptr<impeller::RuntimeStage> runtime_stage =
160 (*runtime_stages)[backend];
161 if (!runtime_stage) {
162 std::ostringstream stream;
163 stream << "Asset '" << asset_name
164 << "' does not contain appropriate runtime stage data for current "
165 "backend ("
166 << RuntimeStageBackendToString(backend) << ")." << std::endl
167 << "Found stages: ";
168 for (const auto& kvp : *runtime_stages) {
169 if (kvp.second) {
170 stream << RuntimeStageBackendToString(kvp.first) << " ";
171 }
172 }
173 return stream.str();
174 }
175
176 int sampled_image_count = 0;
177 size_t other_uniforms_bytes = 0;
178 const std::vector<impeller::RuntimeUniformDescription>& uniforms =
179 runtime_stage->GetUniforms();
180 Dart_Handle uniform_info = Dart_NewList(uniforms.size());
181 FML_DCHECK(!Dart_IsError(uniform_info));
182 for (size_t i = 0; i < uniforms.size(); ++i) {
183 const impeller::RuntimeUniformDescription& uniform_description =
184 uniforms[i];
185
186 Dart_Handle map = ConvertUniformDescriptionToMap(uniform_description);
187 [[maybe_unused]] Dart_Handle dart_result =
188 Dart_ListSetAt(uniform_info, i, map);
189 FML_DCHECK(!Dart_IsError(dart_result));
190
191 if (uniform_description.type ==
193 sampled_image_count++;
194 } else {
195 other_uniforms_bytes += uniform_description.GetDartSize();
196 }
197 }
198
199 if (UIDartState::Current()->IsImpellerEnabled()) {
200 // Spawn (but do not block on) a task that will load the runtime stage and
201 // populate an initial shader variant.
202 auto snapshot_controller = UIDartState::Current()->GetSnapshotDelegate();
203 ui_dart_state->GetTaskRunners().GetRasterTaskRunner()->PostTask(
204 [runtime_stage, snapshot_controller]() {
205 if (!snapshot_controller) {
206 return;
207 }
208 snapshot_controller->CacheRuntimeStage(runtime_stage);
209 });
210#if IMPELLER_SUPPORTS_RENDERING
211 runtime_effect_ = DlRuntimeEffectImpeller::Make(std::move(runtime_stage));
212#endif
213 } else {
214 const auto& code_mapping = runtime_stage->GetCodeMapping();
215 auto code_size = code_mapping->GetSize();
216 const char* sksl =
217 reinterpret_cast<const char*>(code_mapping->GetMapping());
218 // SkString makes a copy.
219 SkRuntimeEffect::Result result =
220 SkRuntimeEffect::MakeForShader(SkString(sksl, code_size));
221 if (result.effect == nullptr) {
222 return std::string("Invalid SkSL:\n") + sksl +
223 std::string("\nSkSL Error:\n") + result.errorText.c_str();
224 }
225 runtime_effect_ = DlRuntimeEffectSkia::Make(result.effect);
226 }
227
228 Dart_Handle ths = Dart_HandleFromWeakPersistent(dart_wrapper());
229 if (Dart_IsError(ths)) {
230 Dart_PropagateError(ths);
231 }
232
233 Dart_Handle result = Dart_SetField(ths, tonic::ToDart("_samplerCount"),
234 Dart_NewInteger(sampled_image_count));
235 if (Dart_IsError(result)) {
236 return "Failed to set sampler count for fragment program.";
237 }
238
239 size_t rounded_uniform_bytes =
240 (other_uniforms_bytes + sizeof(float) - 1) & ~(sizeof(float) - 1);
241 size_t float_count = rounded_uniform_bytes / sizeof(float);
242
243 result = Dart_SetField(ths, tonic::ToDart("_uniformFloatCount"),
244 Dart_NewInteger(float_count));
245 if (Dart_IsError(result)) {
246 return "Failed to set uniform float count for fragment program.";
247 }
248
249 result = Dart_SetField(ths, tonic::ToDart("_uniformInfo"), uniform_info);
250 if (Dart_IsError(result)) {
251 FML_DLOG(ERROR) << Dart_GetError(result);
252 return "Failed to set uniform info for fragment program.";
253 }
254
255 return "";
256}
static sk_sp< DlRuntimeEffect > Make(std::shared_ptr< impeller::RuntimeStage > runtime_stage)
static sk_sp< DlRuntimeEffect > Make(const sk_sp< SkRuntimeEffect > &runtime_effect)
fml::TaskRunnerAffineWeakPtr< SnapshotDelegate > GetSnapshotDelegate() const
static UIDartState * Current()
static absl::StatusOr< Map > DecodeRuntimeStages(const std::shared_ptr< fml::Mapping > &payload)
Dart_WeakPersistentHandle dart_wrapper() const
#define FML_DLOG(severity)
Definition logging.h:121
#define FML_DCHECK(condition)
Definition logging.h:122
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36
static std::string RuntimeStageBackendToString(impeller::RuntimeStageBackend backend)
Dart_Handle ToDart(const T &object)
size_t GetDartSize() const
Computes the total number of bytes that this uniform requires for representation in the Dart float bu...
#define FML_TRACE_EVENT(category_group, name,...)

References flutter::PlatformConfiguration::client(), flutter::UIDartState::Current(), tonic::DartWrappable::dart_wrapper(), flutter::data, impeller::RuntimeStage::DecodeRuntimeStages(), FML_DCHECK, FML_DLOG, FML_TRACE_EVENT, flutter::PlatformConfigurationClient::GetAssetManager(), impeller::RuntimeUniformDescription::GetDartSize(), flutter::TaskRunners::GetRasterTaskRunner(), flutter::UIDartState::GetRuntimeStageBackend(), flutter::UIDartState::GetSnapshotDelegate(), flutter::UIDartState::GetTaskRunners(), i, impeller::kSampledImage, flutter::DlRuntimeEffectSkia::Make(), flutter::DlRuntimeEffectImpeller::Make(), flutter::UIDartState::platform_configuration(), fml::TaskRunner::PostTask(), flutter::RuntimeStageBackendToString(), tonic::ToDart(), and impeller::RuntimeUniformDescription::type.

◆ MakeDlColorSource()

std::shared_ptr< DlColorSource > flutter::FragmentProgram::MakeDlColorSource ( std::shared_ptr< std::vector< uint8_t > >  float_uniforms,
const std::vector< std::shared_ptr< DlColorSource > > &  children 
)

Definition at line 258 of file fragment_program.cc.

260 {
261 return DlColorSource::MakeRuntimeEffect(runtime_effect_, children,
262 std::move(float_uniforms));
263}
static std::shared_ptr< DlColorSource > MakeRuntimeEffect(sk_sp< DlRuntimeEffect > runtime_effect, std::vector< std::shared_ptr< DlColorSource > > samplers, std::shared_ptr< std::vector< uint8_t > > uniform_data)

References flutter::DlColorSource::MakeRuntimeEffect().

◆ MakeDlImageFilter()

std::shared_ptr< DlImageFilter > flutter::FragmentProgram::MakeDlImageFilter ( std::shared_ptr< std::vector< uint8_t > >  float_uniforms,
const std::vector< std::shared_ptr< DlColorSource > > &  children 
)

Definition at line 265 of file fragment_program.cc.

267 {
268 return DlImageFilter::MakeRuntimeEffect(runtime_effect_, children,
269 std::move(float_uniforms));
270}
static std::shared_ptr< DlImageFilter > MakeRuntimeEffect(sk_sp< DlRuntimeEffect > runtime_effect, std::vector< std::shared_ptr< DlColorSource > > samplers, std::shared_ptr< std::vector< uint8_t > > uniform_data)

References flutter::DlImageFilter::MakeRuntimeEffect().

◆ shader()

fml::RefPtr< FragmentShader > flutter::FragmentProgram::shader ( Dart_Handle  shader,
Dart_Handle  uniforms_handle,
Dart_Handle  samplers 
)

The documentation for this class was generated from the following files: