blob: bbfa7180a017bdd9bad83ade0e98bc7ac5f3d520 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_SYSMEM_SERVER_USAGE_PIXEL_FORMAT_COST_H_
#define SRC_SYSMEM_SERVER_USAGE_PIXEL_FORMAT_COST_H_
#include <fidl/fuchsia.sysmem2/cpp/fidl.h>
#include <fidl/fuchsia.sysmem2/cpp/wire.h>
#include <cstdint>
namespace sysmem_service {
// This class effectively breaks ties in a platform-specific way among the list
// of PixelFormat(s) that a set of participants are all able to support.
//
// At first, the list of PixelFormat(s) that all participants are able to
// support is likely to be a short list. But even if that list is only 2
// entries long, we'll typically want to prefer a particular choice depending
// on considerations like max throughput, power usage, efficiency
// considerations, etc.
//
// For now, the overrides are baked into sysmem based on the platform ID (AKA
// PID), in usage_overrides_*.cpp.
//
// Any override will take precedence over the default PixelFormat sort order.
class UsagePixelFormatCost {
public:
UsagePixelFormatCost(std::vector<fuchsia_sysmem2::FormatCostEntry> entries);
// Compare the cost of two pixel formats, returning -1 if the first format
// is lower cost, 0 if they're equal cost or unknown, and 1 if the first
// format is higher cost.
//
// By passing in the BufferCollectionConstraints, the implementation can
// consider other aspects of constraints in addition to the usage.
int32_t Compare(const fuchsia_sysmem2::BufferCollectionConstraints& constraints,
uint32_t image_format_constraints_index_a,
uint32_t image_format_constraints_index_b) const;
private:
double GetCost(const fuchsia_sysmem2::BufferCollectionConstraints& constraints,
uint32_t image_format_constraints_index) const;
const std::vector<fuchsia_sysmem2::FormatCostEntry> entries_;
};
} // namespace sysmem_service
#endif // SRC_SYSMEM_SERVER_USAGE_PIXEL_FORMAT_COST_H_