blob: 044498d6182706d41b5cb441121ad846721c0490 [file] [log] [blame]
// 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.
#pragma once
#include "flutter/fml/logging.h"
#include "flutter/fml/macros.h"
#include "impeller/base/strings.h"
#include "impeller/base/validation.h"
#include "impeller/renderer/compute_pipeline_descriptor.h"
#include "impeller/renderer/context.h"
#include "impeller/renderer/formats.h"
#include "impeller/renderer/shader_library.h"
#include "impeller/renderer/vertex_descriptor.h"
namespace impeller {
//------------------------------------------------------------------------------
/// @brief An optional (but highly recommended) utility for creating
/// pipelines from reflected shader information.
///
/// @tparam Compute_Shader The reflected compute shader information. Found
/// in a generated header file called
/// <shader_name>.comp.h.
///
template <class ComputeShader_>
struct ComputePipelineBuilder {
public:
using ComputeShader = ComputeShader_;
//----------------------------------------------------------------------------
/// @brief Create a default pipeline descriptor using the combination
/// reflected shader information. The descriptor can be configured
/// further before a pipeline state object is created using it.
///
/// @param[in] context The context
///
/// @return If the combination of reflected shader information is
/// compatible and the requisite functions can be found in the
/// context, a pipeline descriptor.
///
static std::optional<ComputePipelineDescriptor> MakeDefaultPipelineDescriptor(
const Context& context) {
ComputePipelineDescriptor desc;
if (InitializePipelineDescriptorDefaults(context, desc)) {
return {std::move(desc)};
} else {
return std::nullopt;
}
}
[[nodiscard]] static bool InitializePipelineDescriptorDefaults(
const Context& context,
ComputePipelineDescriptor& desc) {
// Setup debug instrumentation.
desc.SetLabel(SPrintF("%s Pipeline", ComputeShader::kLabel.data()));
// Resolve pipeline entrypoints.
{
auto compute_function = context.GetShaderLibrary()->GetFunction(
ComputeShader::kEntrypointName, ShaderStage::kCompute);
if (!compute_function) {
VALIDATION_LOG << "Could not resolve compute pipeline entrypoint '"
<< ComputeShader::kEntrypointName
<< "' for pipeline named '" << ComputeShader::kLabel
<< "'.";
return false;
}
desc.SetStageEntrypoint(std::move(compute_function));
}
return true;
}
};
} // namespace impeller