[base] Introduce ExplicitArgumentBarrier to make_span
This change adds ExplicitArgumentBarrier to base::make_span, blocking callers from explicitly specifying types the compiler can deduce for them. It also performs some other minor clean-ups in effected code, such as getting rid of base::make_span completely when an implicit conversion would have been performed anyway. TBR=khushalsagar,caseq,mcasas,kouhei,rockot@google.com Bug: 828324 Change-Id: I4c462b9802c477baf6f601ee5651a90a6d929fbf Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1871699 Commit-Queue: Jan Wilken Dörrie <jdoerrie@chromium.org> Reviewed-by: Daniel Cheng <dcheng@chromium.org> Cr-Commit-Position: refs/heads/master@{#709426}
This commit is contained in:

committed by
Commit Bot

parent
b6f109c6a1
commit
b80801c5c6
base/containers
cc/tiles
content/browser
ipc
media/gpu/vaapi
@ -468,32 +468,33 @@ constexpr void swap(span<T, X>& lhs, span<T, X>& rhs) noexcept {
|
||||
}
|
||||
|
||||
// Type-deducing helpers for constructing a span.
|
||||
template <typename T>
|
||||
template <int&... ExplicitArgumentBarrier, typename T>
|
||||
constexpr span<T> make_span(T* data, size_t size) noexcept {
|
||||
return {data, size};
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
template <int&... ExplicitArgumentBarrier, typename T>
|
||||
constexpr span<T> make_span(T* begin, T* end) noexcept {
|
||||
return {begin, end};
|
||||
}
|
||||
|
||||
template <typename T, size_t N>
|
||||
template <int&... ExplicitArgumentBarrier, typename T, size_t N>
|
||||
constexpr span<T, N> make_span(T (&array)[N]) noexcept {
|
||||
return array;
|
||||
}
|
||||
|
||||
template <typename T, size_t N>
|
||||
template <int&... ExplicitArgumentBarrier, typename T, size_t N>
|
||||
constexpr span<T, N> make_span(std::array<T, N>& array) noexcept {
|
||||
return array;
|
||||
}
|
||||
|
||||
template <typename T, size_t N>
|
||||
template <int&... ExplicitArgumentBarrier, typename T, size_t N>
|
||||
constexpr span<const T, N> make_span(const std::array<T, N>& array) noexcept {
|
||||
return array;
|
||||
}
|
||||
|
||||
template <typename Container,
|
||||
template <int&... ExplicitArgumentBarrier,
|
||||
typename Container,
|
||||
typename T = std::remove_pointer_t<
|
||||
decltype(base::data(std::declval<Container&>()))>,
|
||||
typename = internal::EnableIfSpanCompatibleContainer<Container&, T>>
|
||||
@ -502,6 +503,7 @@ constexpr span<T> make_span(Container& container) noexcept {
|
||||
}
|
||||
|
||||
template <
|
||||
int&... ExplicitArgumentBarrier,
|
||||
typename Container,
|
||||
typename T = std::remove_pointer_t<
|
||||
decltype(base::data(std::declval<const Container&>()))>,
|
||||
@ -511,6 +513,7 @@ constexpr span<T> make_span(const Container& container) noexcept {
|
||||
}
|
||||
|
||||
template <size_t N,
|
||||
int&... ExplicitArgumentBarrier,
|
||||
typename Container,
|
||||
typename T = std::remove_pointer_t<
|
||||
decltype(base::data(std::declval<Container&>()))>,
|
||||
@ -521,6 +524,7 @@ constexpr span<T, N> make_span(Container& container) noexcept {
|
||||
|
||||
template <
|
||||
size_t N,
|
||||
int&... ExplicitArgumentBarrier,
|
||||
typename Container,
|
||||
typename T = std::remove_pointer_t<
|
||||
decltype(base::data(std::declval<const Container&>()))>,
|
||||
@ -529,7 +533,7 @@ constexpr span<T, N> make_span(const Container& container) noexcept {
|
||||
return span<T, N>(container);
|
||||
}
|
||||
|
||||
template <typename T, size_t X>
|
||||
template <int&... ExplicitArgumentBarrier, typename T, size_t X>
|
||||
constexpr span<T, X> make_span(const span<T, X>& span) noexcept {
|
||||
return span;
|
||||
}
|
||||
|
@ -2026,8 +2026,7 @@ void GpuImageDecodeCache::UploadImageIfNecessary(const DrawImage& draw_image,
|
||||
ClientImageTransferCacheEntry::GetNextId();
|
||||
const gpu::SyncToken decode_sync_token =
|
||||
context_->RasterInterface()->ScheduleImageDecode(
|
||||
base::make_span<const uint8_t>(encoded_data->bytes(),
|
||||
encoded_data->size()),
|
||||
base::make_span(encoded_data->bytes(), encoded_data->size()),
|
||||
output_size, transfer_cache_id,
|
||||
color_space ? gfx::ColorSpace(*color_space) : gfx::ColorSpace(),
|
||||
image_data->needs_mips);
|
||||
|
@ -212,8 +212,7 @@ Response WebAuthnHandler::AddCredential(
|
||||
} else {
|
||||
credential_created = authenticator->AddRegistration(
|
||||
CopyBinaryToVector(credential->GetCredentialId()),
|
||||
base::make_span<uint8_t, device::kRpIdHashLength>(
|
||||
device::fido_parsing_utils::CreateSHA256Hash(rp_id)),
|
||||
device::fido_parsing_utils::CreateSHA256Hash(rp_id),
|
||||
CopyBinaryToVector(credential->GetPrivateKey()),
|
||||
credential->GetSignCount());
|
||||
}
|
||||
|
@ -91,10 +91,10 @@ TEST_P(SignedExchangeEnvelopeTest, ParseGoldenFile) {
|
||||
base::StringPiece signature_header_field(
|
||||
contents.data() + signature_header_field_offset,
|
||||
prologue_b.signature_header_field_length());
|
||||
const auto cbor_bytes = base::make_span<const uint8_t>(
|
||||
contents_bytes + signature_header_field_offset +
|
||||
prologue_b.signature_header_field_length(),
|
||||
prologue_b.cbor_header_length());
|
||||
const auto cbor_bytes =
|
||||
base::make_span(contents_bytes + signature_header_field_offset +
|
||||
prologue_b.signature_header_field_length(),
|
||||
prologue_b.cbor_header_length());
|
||||
const base::Optional<SignedExchangeEnvelope> envelope =
|
||||
SignedExchangeEnvelope::Parse(
|
||||
SignedExchangeVersion::kB3, prologue_b.fallback_url(),
|
||||
|
@ -13,9 +13,8 @@ MessageView::MessageView() = default;
|
||||
MessageView::MessageView(
|
||||
const Message& message,
|
||||
base::Optional<std::vector<mojo::native::SerializedHandlePtr>> handles)
|
||||
: buffer_view_(base::make_span<const uint8_t>(
|
||||
static_cast<const uint8_t*>(message.data()),
|
||||
message.size())),
|
||||
: buffer_view_(base::make_span(static_cast<const uint8_t*>(message.data()),
|
||||
message.size())),
|
||||
handles_(std::move(handles)) {}
|
||||
|
||||
MessageView::MessageView(
|
||||
|
@ -73,8 +73,7 @@ void DecodeTask(
|
||||
DVLOGF(1) << "No decoder is available for supplied image";
|
||||
return;
|
||||
}
|
||||
VaapiImageDecodeStatus status = decoder->Decode(
|
||||
base::make_span<const uint8_t>(encoded_data.data(), encoded_data.size()));
|
||||
VaapiImageDecodeStatus status = decoder->Decode(encoded_data);
|
||||
if (status != VaapiImageDecodeStatus::kSuccess) {
|
||||
DVLOGF(1) << "Failed to decode - status = "
|
||||
<< static_cast<uint32_t>(status);
|
||||
@ -177,17 +176,15 @@ VaapiImageDecodeAcceleratorWorker::GetSupportedProfiles() {
|
||||
VaapiImageDecoder* VaapiImageDecodeAcceleratorWorker::GetDecoderForImage(
|
||||
const std::vector<uint8_t>& encoded_data) {
|
||||
DCHECK_CALLED_ON_VALID_SEQUENCE(io_sequence_checker_);
|
||||
auto encoded_data_span =
|
||||
base::make_span<const uint8_t>(encoded_data.data(), encoded_data.size());
|
||||
auto result = decoders_.end();
|
||||
|
||||
if (base::FeatureList::IsEnabled(
|
||||
features::kVaapiJpegImageDecodeAcceleration) &&
|
||||
IsJpegImage(encoded_data_span)) {
|
||||
IsJpegImage(encoded_data)) {
|
||||
result = decoders_.find(gpu::ImageDecodeAcceleratorType::kJpeg);
|
||||
} else if (base::FeatureList::IsEnabled(
|
||||
features::kVaapiWebPImageDecodeAcceleration) &&
|
||||
IsLossyWebPImage(encoded_data_span)) {
|
||||
IsLossyWebPImage(encoded_data)) {
|
||||
result = decoders_.find(gpu::ImageDecodeAcceleratorType::kWebP);
|
||||
}
|
||||
|
||||
|
@ -349,8 +349,7 @@ TEST_P(VaapiJpegDecoderTest, DecodeSucceeds) {
|
||||
std::string jpeg_data;
|
||||
ASSERT_TRUE(base::ReadFileToString(input_file, &jpeg_data))
|
||||
<< "failed to read input data from " << input_file.value();
|
||||
const auto encoded_image = base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()), jpeg_data.size());
|
||||
const auto encoded_image = base::as_bytes(base::make_span(jpeg_data));
|
||||
|
||||
// Skip the image if the VAAPI driver doesn't claim to support its chroma
|
||||
// subsampling format. However, we expect at least 4:2:0 and 4:2:2 support.
|
||||
@ -468,8 +467,7 @@ TEST_F(VaapiJpegDecoderTest, DecodeSucceedsForSupportedSizes) {
|
||||
{max_width, max_height}};
|
||||
for (const auto& test_size : test_sizes) {
|
||||
const std::vector<unsigned char> jpeg_data = GenerateJpegImage(test_size);
|
||||
auto jpeg_data_span = base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()), jpeg_data.size());
|
||||
auto jpeg_data_span = base::as_bytes(base::make_span(jpeg_data));
|
||||
ASSERT_FALSE(jpeg_data.empty());
|
||||
std::unique_ptr<ScopedVAImage> scoped_image = Decode(jpeg_data_span);
|
||||
ASSERT_TRUE(scoped_image)
|
||||
@ -513,8 +511,7 @@ TEST_P(VaapiJpegDecoderWithDmaBufsTest, DecodeSucceeds) {
|
||||
std::string jpeg_data;
|
||||
ASSERT_TRUE(base::ReadFileToString(input_file, &jpeg_data))
|
||||
<< "failed to read input data from " << input_file.value();
|
||||
const auto encoded_image = base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()), jpeg_data.size());
|
||||
const auto encoded_image = base::as_bytes(base::make_span(jpeg_data));
|
||||
|
||||
// Decode into a VAAPI-allocated surface.
|
||||
const VaapiImageDecodeStatus decode_status = decoder_.Decode(encoded_image);
|
||||
@ -667,10 +664,7 @@ TEST_F(VaapiJpegDecoderTest, DecodeFailsForBelowMinSize) {
|
||||
const std::vector<unsigned char> jpeg_data = GenerateJpegImage(test_size);
|
||||
ASSERT_FALSE(jpeg_data.empty());
|
||||
VaapiImageDecodeStatus status = VaapiImageDecodeStatus::kSuccess;
|
||||
ASSERT_FALSE(Decode(base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()),
|
||||
jpeg_data.size()),
|
||||
&status))
|
||||
ASSERT_FALSE(Decode(base::as_bytes(base::make_span(jpeg_data)), &status))
|
||||
<< "Decode unexpectedly succeeded for size = " << test_size.ToString();
|
||||
EXPECT_EQ(VaapiImageDecodeStatus::kUnsupportedImage, status);
|
||||
EXPECT_FALSE(decoder_.GetScopedVASurface());
|
||||
@ -717,10 +711,7 @@ TEST_F(VaapiJpegDecoderTest, DecodeFailsForAboveMaxSize) {
|
||||
const std::vector<unsigned char> jpeg_data = GenerateJpegImage(test_size);
|
||||
ASSERT_FALSE(jpeg_data.empty());
|
||||
VaapiImageDecodeStatus status = VaapiImageDecodeStatus::kSuccess;
|
||||
ASSERT_FALSE(Decode(base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()),
|
||||
jpeg_data.size()),
|
||||
&status))
|
||||
ASSERT_FALSE(Decode(base::as_bytes(base::make_span(jpeg_data)), &status))
|
||||
<< "Decode unexpectedly succeeded for size = " << test_size.ToString();
|
||||
EXPECT_EQ(VaapiImageDecodeStatus::kUnsupportedImage, status);
|
||||
EXPECT_FALSE(decoder_.GetScopedVASurface());
|
||||
@ -734,10 +725,7 @@ TEST_F(VaapiJpegDecoderTest, DecodeFails) {
|
||||
ASSERT_TRUE(base::ReadFileToString(input_file, &jpeg_data))
|
||||
<< "failed to read input data from " << input_file.value();
|
||||
VaapiImageDecodeStatus status = VaapiImageDecodeStatus::kSuccess;
|
||||
ASSERT_FALSE(Decode(
|
||||
base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(jpeg_data.data()), jpeg_data.size()),
|
||||
&status));
|
||||
ASSERT_FALSE(Decode(base::as_bytes(base::make_span(jpeg_data)), &status));
|
||||
EXPECT_EQ(VaapiImageDecodeStatus::kUnsupportedSubsampling, status);
|
||||
EXPECT_FALSE(decoder_.GetScopedVASurface());
|
||||
}
|
||||
|
@ -138,8 +138,7 @@ TEST_P(VaapiWebPDecoderTest, DecodeAndExportAsNativePixmapDmaBuf) {
|
||||
std::string webp_data;
|
||||
ASSERT_TRUE(base::ReadFileToString(input_file, &webp_data))
|
||||
<< "failed to read input data from " << input_file.value();
|
||||
const auto encoded_image = base::make_span<const uint8_t>(
|
||||
reinterpret_cast<const uint8_t*>(webp_data.data()), webp_data.size());
|
||||
const auto encoded_image = base::as_bytes(base::make_span(webp_data));
|
||||
|
||||
// Decode the image using the VA-API and wrap the decoded image in a
|
||||
// DecodedImage object.
|
||||
|
Reference in New Issue
Block a user