summaryrefslogtreecommitdiff
path: root/chromium/components/viz/common
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 17:21:03 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 16:25:15 +0000
commitc551f43206405019121bd2b2c93714319a0a3300 (patch)
tree1f48c30631c421fd4bbb3c36da20183c8a2ed7d7 /chromium/components/viz/common
parent7961cea6d1041e3e454dae6a1da660b453efd238 (diff)
downloadqtwebengine-chromium-c551f43206405019121bd2b2c93714319a0a3300.tar.gz
BASELINE: Update Chromium to 79.0.3945.139
Change-Id: I336b7182fab9bca80b709682489c07db112eaca5 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/components/viz/common')
-rw-r--r--chromium/components/viz/common/BUILD.gn1
-rw-r--r--chromium/components/viz/common/features.cc22
-rw-r--r--chromium/components/viz/common/frame_sinks/begin_frame_source_unittest.cc5
-rw-r--r--chromium/components/viz/common/frame_timing_details.h4
-rw-r--r--chromium/components/viz/common/gl_helper.cc45
-rw-r--r--chromium/components/viz/common/gl_helper.h1
-rw-r--r--chromium/components/viz/common/gl_helper_unittest.cc15
-rw-r--r--chromium/components/viz/common/gpu/metal_context_provider.mm1
-rw-r--r--chromium/components/viz/common/gpu/vulkan_in_process_context_provider.cc35
-rw-r--r--chromium/components/viz/common/quads/compositor_frame_metadata.cc2
-rw-r--r--chromium/components/viz/common/quads/draw_quad.h8
-rw-r--r--chromium/components/viz/common/quads/draw_quad_perftest.cc17
-rw-r--r--chromium/components/viz/common/quads/draw_quad_unittest.cc50
-rw-r--r--chromium/components/viz/common/quads/render_pass_draw_quad.cc10
-rw-r--r--chromium/components/viz/common/quads/render_pass_draw_quad.h3
-rw-r--r--chromium/components/viz/common/quads/render_pass_unittest.cc4
-rw-r--r--chromium/components/viz/common/quads/stream_video_draw_quad.cc19
-rw-r--r--chromium/components/viz/common/quads/stream_video_draw_quad.h21
-rw-r--r--chromium/components/viz/common/resources/DEPS1
-rw-r--r--chromium/components/viz/common/resources/resource_format.h1
-rw-r--r--chromium/components/viz/common/resources/resource_format_utils.cc66
-rw-r--r--chromium/components/viz/common/resources/resource_format_utils.h1
-rw-r--r--chromium/components/viz/common/resources/resource_sizes.h199
-rw-r--r--chromium/components/viz/common/resources/resource_sizes_unittest.cc26
-rw-r--r--chromium/components/viz/common/resources/transferable_resource.h5
-rw-r--r--chromium/components/viz/common/yuv_readback_unittest.cc13
26 files changed, 327 insertions, 248 deletions
diff --git a/chromium/components/viz/common/BUILD.gn b/chromium/components/viz/common/BUILD.gn
index 5ea9cd2577b..b1d14bdd382 100644
--- a/chromium/components/viz/common/BUILD.gn
+++ b/chromium/components/viz/common/BUILD.gn
@@ -254,6 +254,7 @@ viz_component("common") {
"//gpu/command_buffer/client:gles2_interface",
"//gpu/command_buffer/client:raster",
"//gpu/command_buffer/client:raster_interface",
+ "//gpu/config",
"//gpu/ipc/common:common",
"//gpu/vulkan:buildflags",
"//mojo/public/cpp/base",
diff --git a/chromium/components/viz/common/features.cc b/chromium/components/viz/common/features.cc
index 758902da3f2..59f04b95cde 100644
--- a/chromium/components/viz/common/features.cc
+++ b/chromium/components/viz/common/features.cc
@@ -7,10 +7,7 @@
#include "base/command_line.h"
#include "build/build_config.h"
#include "components/viz/common/switches.h"
-
-#if defined(OS_ANDROID)
-#include "gpu/config/gpu_finch_features.h" // nogncheck
-#endif
+#include "gpu/config/gpu_finch_features.h"
namespace features {
@@ -27,8 +24,13 @@ const base::Feature kVizDisplayCompositor{"VizDisplayCompositor",
base::FEATURE_ENABLED_BY_DEFAULT};
#endif
+#if defined(OS_CHROMEOS)
const base::Feature kEnableVizHitTestSurfaceLayer{
"VizHitTestSurfaceLayer", base::FEATURE_DISABLED_BY_DEFAULT};
+#else
+const base::Feature kEnableVizHitTestSurfaceLayer{
+ "VizHitTestSurfaceLayer", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif
// Use Skia's readback API instead of GLRendererCopier.
const base::Feature kUseSkiaForGLReadback{"UseSkiaForGLReadback",
@@ -80,13 +82,19 @@ bool IsUsingSkiaForGLReadback() {
bool IsUsingSkiaRenderer() {
// We require OOP-D everywhere but WebView.
- bool enabled = base::FeatureList::IsEnabled(kUseSkiaRenderer);
-#if !defined(OS_ANDROID)
+ bool enabled = base::FeatureList::IsEnabled(kUseSkiaRenderer) ||
+ base::FeatureList::IsEnabled(kVulkan);
+#if defined(OS_ANDROID)
+ if (enabled && IsAndroidSurfaceControlEnabled()) {
+ DLOG(ERROR) << "UseSkiaRenderer does not work with SurfaceControl";
+ return false;
+ }
+#else
if (enabled && !IsVizDisplayCompositorEnabled()) {
DLOG(ERROR) << "UseSkiaRenderer requires VizDisplayCompositor.";
return false;
}
-#endif // !defined(OS_ANDROID)
+#endif // defined(OS_ANDROID)
return enabled;
}
diff --git a/chromium/components/viz/common/frame_sinks/begin_frame_source_unittest.cc b/chromium/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
index 17478bf8505..6ef808e659c 100644
--- a/chromium/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
+++ b/chromium/components/viz/common/frame_sinks/begin_frame_source_unittest.cc
@@ -6,7 +6,8 @@
#include <stdint.h>
-#include "base/memory/ptr_util.h"
+#include <memory>
+
#include "base/test/test_mock_time_task_runner.h"
#include "components/viz/test/begin_frame_args_test.h"
#include "components/viz/test/begin_frame_source_test.h"
@@ -69,7 +70,7 @@ class BackToBackBeginFrameSourceTest : public ::testing::Test {
delay_based_time_source_ = time_source.get();
source_.reset(new BackToBackBeginFrameSource(std::move(time_source)));
- obs_ = base::WrapUnique(new ::testing::NiceMock<MockBeginFrameObserver>);
+ obs_ = std::make_unique<::testing::NiceMock<MockBeginFrameObserver>>();
}
void TearDown() override { obs_.reset(); }
diff --git a/chromium/components/viz/common/frame_timing_details.h b/chromium/components/viz/common/frame_timing_details.h
index e07e7f8b227..3b59b235a9a 100644
--- a/chromium/components/viz/common/frame_timing_details.h
+++ b/chromium/components/viz/common/frame_timing_details.h
@@ -6,13 +6,15 @@
#define COMPONENTS_VIZ_COMMON_FRAME_TIMING_DETAILS_H_
#include "ui/gfx/presentation_feedback.h"
+#include "ui/gfx/swap_result.h"
namespace viz {
struct FrameTimingDetails {
- gfx::PresentationFeedback presentation_feedback;
base::TimeTicks received_compositor_frame_timestamp;
base::TimeTicks draw_start_timestamp;
+ gfx::SwapTimings swap_timings;
+ gfx::PresentationFeedback presentation_feedback;
};
} // namespace viz
diff --git a/chromium/components/viz/common/gl_helper.cc b/chromium/components/viz/common/gl_helper.cc
index 1637b30c682..cabd57eaf79 100644
--- a/chromium/components/viz/common/gl_helper.cc
+++ b/chromium/components/viz/common/gl_helper.cc
@@ -95,9 +95,9 @@ class I420ConverterImpl : public I420Converter {
GLenum GetReadbackFormat() const override;
protected:
- // Returns true if the planerizer should use the faster, two-pass shaders to
- // generate the YUV planar outputs. If false, the source will be scanned three
- // times, once for each Y/U/V plane.
+ // Returns true if the planerizer should use the faster, two-pass shaders
+ // to generate the YUV planar outputs. If false, the source will be
+ // scanned three times, once for each Y/U/V plane.
bool use_mrt() const { return !v_planerizer_; }
// Reallocates the intermediate and plane textures, if needed.
@@ -112,9 +112,9 @@ class I420ConverterImpl : public I420Converter {
private:
// These generate the Y/U/V planes. If MRT is being used, |y_planerizer_|
- // generates the Y and interim UV plane, |u_planerizer_| generates the final U
- // and V planes, and |v_planerizer_| is unused. If MRT is not being used, each
- // of these generates only one of the Y/U/V planes.
+ // generates the Y and interim UV plane, |u_planerizer_| generates the
+ // final U and V planes, and |v_planerizer_| is unused. If MRT is not
+ // being used, each of these generates only one of the Y/U/V planes.
const std::unique_ptr<GLHelper::ScalerInterface> y_planerizer_;
const std::unique_ptr<GLHelper::ScalerInterface> u_planerizer_;
const std::unique_ptr<GLHelper::ScalerInterface> v_planerizer_;
@@ -122,8 +122,8 @@ class I420ConverterImpl : public I420Converter {
// Intermediate texture, holding the scaler's output.
base::Optional<TextureHolder> intermediate_;
- // Intermediate texture, holding the UV interim output (if the MRT shader is
- // being used).
+ // Intermediate texture, holding the UV interim output (if the MRT shader
+ // is being used).
base::Optional<ScopedTexture> uv_;
DISALLOW_COPY_AND_ASSIGN(I420ConverterImpl);
@@ -146,6 +146,7 @@ class GLHelper::CopyTextureToImpl
~CopyTextureToImpl() { CancelRequests(); }
void ReadbackTextureAsync(GLuint texture,
+ GLenum texture_target,
const gfx::Size& dst_size,
unsigned char* out,
SkColorType color_type,
@@ -267,8 +268,8 @@ class GLHelper::CopyTextureToImpl
CopyTextureToImpl* copy_impl_;
ReadbackSwizzle swizzle_;
- // May be null if no scaling is required. This can be changed between calls
- // to ReadbackYUV().
+ // May be null if no scaling is required. This can be changed between
+ // calls to ReadbackYUV().
std::unique_ptr<GLHelper::ScalerInterface> scaler_;
// These are the output textures for each Y/U/V plane.
@@ -366,6 +367,7 @@ void GLHelper::CopyTextureToImpl::ReadbackAsync(
void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
GLuint texture,
+ GLenum texture_target,
const gfx::Size& dst_size,
unsigned char* out,
SkColorType color_type,
@@ -379,9 +381,10 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
IsBGRAReadbackSupported()) {
format = GL_BGRA_EXT;
} else {
- // Note: It's possible the GL implementation supports other readback types.
- // However, as of this writing, no caller of this method will request a
- // different |color_type| (i.e., requiring using some other GL format).
+ // Note: It's possible the GL implementation supports other readback
+ // types. However, as of this writing, no caller of this method will
+ // request a different |color_type| (i.e., requiring using some other GL
+ // format).
std::move(callback).Run(false);
return;
}
@@ -389,12 +392,13 @@ void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
ScopedFramebuffer dst_framebuffer(gl_);
ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
dst_framebuffer);
- ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
- gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- texture, 0);
+ gl_->BindTexture(texture_target, texture);
+ gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ texture_target, texture, 0);
ReadbackAsync(dst_size, dst_size.width() * kBytesPerPixel,
dst_size.width() * kBytesPerPixel, out, format,
GL_UNSIGNED_BYTE, kBytesPerPixel, std::move(callback));
+ gl_->BindTexture(texture_target, 0);
}
void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request,
@@ -490,13 +494,14 @@ GLHelper::GLHelper(GLES2Interface* gl, gpu::ContextSupport* context_support)
GLHelper::~GLHelper() {}
void GLHelper::ReadbackTextureAsync(GLuint texture,
+ GLenum texture_target,
const gfx::Size& dst_size,
unsigned char* out,
SkColorType color_type,
base::OnceCallback<void(bool)> callback) {
InitCopyTextToImpl();
- copy_texture_to_impl_->ReadbackTextureAsync(texture, dst_size, out,
- color_type, std::move(callback));
+ copy_texture_to_impl_->ReadbackTextureAsync(
+ texture, texture_target, dst_size, out, color_type, std::move(callback));
}
void GLHelper::InitCopyTextToImpl() {
@@ -744,8 +749,8 @@ void GLHelper::CopyTextureToImpl::ReadbackYUVImpl::ReadbackYUV(
I420ConverterImpl::Convert(texture, src_texture_size, gfx::Vector2dF(),
scaler_.get(), output_rect, y_, u_, v_);
- // Read back planes, one at a time. Keep the video frame alive while doing the
- // readback.
+ // Read back planes, one at a time. Keep the video frame alive while doing
+ // the readback.
const gfx::Rect paste_rect(paste_location, output_rect.size());
const auto SetUpAndBindFramebuffer = [this](GLuint framebuffer,
GLuint texture) {
diff --git a/chromium/components/viz/common/gl_helper.h b/chromium/components/viz/common/gl_helper.h
index 4f2e4aebae0..8ae29d9fc97 100644
--- a/chromium/components/viz/common/gl_helper.h
+++ b/chromium/components/viz/common/gl_helper.h
@@ -164,6 +164,7 @@ class VIZ_COMMON_EXPORT GLHelper {
// TODO(crbug.com/870036): DEPRECATED. This will be moved to be closer to its
// one caller soon.
void ReadbackTextureAsync(GLuint texture,
+ GLenum texture_target,
const gfx::Size& dst_size,
unsigned char* out,
SkColorType color_type,
diff --git a/chromium/components/viz/common/gl_helper_unittest.cc b/chromium/components/viz/common/gl_helper_unittest.cc
index 450f72c1f4e..5895c38e236 100644
--- a/chromium/components/viz/common/gl_helper_unittest.cc
+++ b/chromium/components/viz/common/gl_helper_unittest.cc
@@ -17,6 +17,7 @@
#include "base/bind.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/numerics/ranges.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
@@ -104,14 +105,14 @@ class GLHelperTest : public testing::Test {
int Channel(SkBitmap* pixels, int x, int y, int c) {
if (pixels->bytesPerPixel() == 4) {
uint32_t* data =
- pixels->getAddr32(std::max(0, std::min(x, pixels->width() - 1)),
- std::max(0, std::min(y, pixels->height() - 1)));
+ pixels->getAddr32(base::ClampToRange(x, 0, pixels->width() - 1),
+ base::ClampToRange(y, 0, pixels->height() - 1));
return (*data) >> (c * 8) & 0xff;
} else {
DCHECK_EQ(pixels->bytesPerPixel(), 1);
DCHECK_EQ(c, 0);
- return *pixels->getAddr8(std::max(0, std::min(x, pixels->width() - 1)),
- std::max(0, std::min(y, pixels->height() - 1)));
+ return *pixels->getAddr8(base::ClampToRange(x, 0, pixels->width() - 1),
+ base::ClampToRange(y, 0, pixels->height() - 1));
}
}
@@ -124,13 +125,13 @@ class GLHelperTest : public testing::Test {
DCHECK_LT(y, pixels->height());
if (pixels->bytesPerPixel() == 4) {
uint32_t* data = pixels->getAddr32(x, y);
- v = std::max(0, std::min(v, 255));
+ v = base::ClampToRange(v, 0, 255);
*data = (*data & ~(0xffu << (c * 8))) | (v << (c * 8));
} else {
DCHECK_EQ(pixels->bytesPerPixel(), 1);
DCHECK_EQ(c, 0);
uint8_t* data = pixels->getAddr8(x, y);
- v = std::max(0, std::min(v, 255));
+ v = base::ClampToRange(v, 0, 255);
*data = v;
}
}
@@ -1008,7 +1009,7 @@ class GLHelperTest : public testing::Test {
base::RunLoop run_loop;
bool success = false;
helper_->ReadbackTextureAsync(
- src_texture, src_size, pixels, color_type,
+ src_texture, GL_TEXTURE_2D, src_size, pixels, color_type,
base::BindOnce(
[](bool* success, base::OnceClosure callback, bool result) {
*success = result;
diff --git a/chromium/components/viz/common/gpu/metal_context_provider.mm b/chromium/components/viz/common/gpu/metal_context_provider.mm
index 9489d94cc32..2da6c0932d7 100644
--- a/chromium/components/viz/common/gpu/metal_context_provider.mm
+++ b/chromium/components/viz/common/gpu/metal_context_provider.mm
@@ -22,7 +22,6 @@ const char* kTestShaderSource =
""
"#include <metal_stdlib>\n"
"#include <simd/simd.h>\n"
- "using namespace metal;\n"
"typedef struct {\n"
" float4 clipSpacePosition [[position]];\n"
" float4 color;\n"
diff --git a/chromium/components/viz/common/gpu/vulkan_in_process_context_provider.cc b/chromium/components/viz/common/gpu/vulkan_in_process_context_provider.cc
index 8ea62aaf52a..fa2b8aead95 100644
--- a/chromium/components/viz/common/gpu/vulkan_in_process_context_provider.cc
+++ b/chromium/components/viz/common/gpu/vulkan_in_process_context_provider.cc
@@ -45,18 +45,24 @@ VulkanInProcessContextProvider::~VulkanInProcessContextProvider() {
bool VulkanInProcessContextProvider::Initialize() {
DCHECK(!device_queue_);
- const gfx::ExtensionSet& extensions =
- vulkan_implementation_->GetVulkanInstance()->enabled_extensions();
- bool support_surface =
- gfx::HasExtension(extensions, VK_KHR_SURFACE_EXTENSION_NAME);
+
+ const auto& instance_extensions = vulkan_implementation_->GetVulkanInstance()
+ ->vulkan_info()
+ .enabled_instance_extensions;
+
uint32_t flags = gpu::VulkanDeviceQueue::GRAPHICS_QUEUE_FLAG;
- if (support_surface)
- flags |= gpu::VulkanDeviceQueue::PRESENTATION_SUPPORT_QUEUE_FLAG;
- std::unique_ptr<gpu::VulkanDeviceQueue> device_queue =
- gpu::CreateVulkanDeviceQueue(vulkan_implementation_, flags);
- if (!device_queue)
+ constexpr base::StringPiece surface_extension_name(
+ VK_KHR_SURFACE_EXTENSION_NAME);
+ for (const auto* extension : instance_extensions) {
+ if (surface_extension_name == extension) {
+ flags |= gpu::VulkanDeviceQueue::PRESENTATION_SUPPORT_QUEUE_FLAG;
+ break;
+ }
+ }
+
+ device_queue_ = gpu::CreateVulkanDeviceQueue(vulkan_implementation_, flags);
+ if (!device_queue_)
return false;
- device_queue_ = std::move(device_queue);
GrVkBackendContext backend_context;
backend_context.fInstance = device_queue_->GetVulkanInstance();
@@ -64,8 +70,9 @@ bool VulkanInProcessContextProvider::Initialize() {
backend_context.fDevice = device_queue_->GetVulkanDevice();
backend_context.fQueue = device_queue_->GetVulkanQueue();
backend_context.fGraphicsQueueIndex = device_queue_->GetVulkanQueueIndex();
- backend_context.fMaxAPIVersion =
- vulkan_implementation_->GetVulkanInstance()->api_version();
+ backend_context.fMaxAPIVersion = vulkan_implementation_->GetVulkanInstance()
+ ->vulkan_info()
+ .used_api_version;
gpu::VulkanFunctionPointers* vulkan_function_pointers =
gpu::GetVulkanFunctionPointers();
@@ -73,11 +80,7 @@ bool VulkanInProcessContextProvider::Initialize() {
make_unified_getter(vulkan_function_pointers->vkGetInstanceProcAddrFn,
vulkan_function_pointers->vkGetDeviceProcAddrFn);
- std::vector<const char*> instance_extensions;
std::vector<const char*> device_extensions;
- instance_extensions.reserve(extensions.size());
- for (const auto& extension : extensions)
- instance_extensions.push_back(extension.data());
device_extensions.reserve(device_queue_->enabled_extensions().size());
for (const auto& extension : device_queue_->enabled_extensions())
device_extensions.push_back(extension.data());
diff --git a/chromium/components/viz/common/quads/compositor_frame_metadata.cc b/chromium/components/viz/common/quads/compositor_frame_metadata.cc
index dcf9aff775e..96c246eeb84 100644
--- a/chromium/components/viz/common/quads/compositor_frame_metadata.cc
+++ b/chromium/components/viz/common/quads/compositor_frame_metadata.cc
@@ -11,7 +11,7 @@ CompositorFrameMetadata::CompositorFrameMetadata() = default;
CompositorFrameMetadata::CompositorFrameMetadata(
CompositorFrameMetadata&& other) = default;
-CompositorFrameMetadata::~CompositorFrameMetadata() {}
+CompositorFrameMetadata::~CompositorFrameMetadata() = default;
CompositorFrameMetadata& CompositorFrameMetadata::operator=(
CompositorFrameMetadata&& other) = default;
diff --git a/chromium/components/viz/common/quads/draw_quad.h b/chromium/components/viz/common/quads/draw_quad.h
index 5c39759e836..242a550e300 100644
--- a/chromium/components/viz/common/quads/draw_quad.h
+++ b/chromium/components/viz/common/quads/draw_quad.h
@@ -81,11 +81,15 @@ class VIZ_COMMON_EXPORT DrawQuad {
// Is the left edge of this tile aligned with the originating layer's
// left edge?
- bool IsLeftEdge() const { return !rect.x(); }
+ bool IsLeftEdge() const {
+ return rect.x() == shared_quad_state->quad_layer_rect.x();
+ }
// Is the top edge of this tile aligned with the originating layer's
// top edge?
- bool IsTopEdge() const { return !rect.y(); }
+ bool IsTopEdge() const {
+ return rect.y() == shared_quad_state->quad_layer_rect.y();
+ }
// Is the right edge of this tile aligned with the originating layer's
// right edge?
diff --git a/chromium/components/viz/common/quads/draw_quad_perftest.cc b/chromium/components/viz/common/quads/draw_quad_perftest.cc
index a8005e87550..48e9055986b 100644
--- a/chromium/components/viz/common/quads/draw_quad_perftest.cc
+++ b/chromium/components/viz/common/quads/draw_quad_perftest.cc
@@ -11,7 +11,7 @@
#include "components/viz/common/quads/render_pass.h"
#include "components/viz/common/quads/texture_draw_quad.h"
#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/perf/perf_test.h"
+#include "testing/perf/perf_result_reporter.h"
#include "third_party/skia/include/core/SkBlendMode.h"
namespace viz {
@@ -21,6 +21,15 @@ static const int kTimeLimitMillis = 2000;
static const int kWarmupRuns = 5;
static const int kTimeCheckInterval = 10;
+constexpr char kMetricPrefixDrawQuad[] = "DrawQuad.";
+constexpr char kMetricIterateResourcesRunsPerS[] = "iterate_resources";
+
+perf_test::PerfResultReporter SetUpDrawQuadReporter(const std::string& story) {
+ perf_test::PerfResultReporter reporter(kMetricPrefixDrawQuad, story);
+ reporter.RegisterImportantMetric(kMetricIterateResourcesRunsPerS, "runs/s");
+ return reporter;
+}
+
SharedQuadState* CreateSharedQuadState(RenderPass* render_pass) {
gfx::Transform quad_transform = gfx::Transform(1.0, 0.0, 0.5, 1.0, 0.5, 0.0);
gfx::Rect content_rect(26, 28);
@@ -82,7 +91,7 @@ class DrawQuadPerfTest : public testing::Test {
}
}
- void RunIterateResourceTest(const std::string& test_name, int quad_count) {
+ void RunIterateResourceTest(const std::string& story, int quad_count) {
CreateRenderPass();
std::vector<DrawQuad*> quads;
GenerateTextureDrawQuads(quad_count, &quads);
@@ -96,8 +105,8 @@ class DrawQuadPerfTest : public testing::Test {
timer_.NextLap();
} while (!timer_.HasTimeLimitExpired());
- perf_test::PrintResult("draw_quad_iterate_resources", "", test_name,
- timer_.LapsPerSecond(), "runs/s", true);
+ auto reporter = SetUpDrawQuadReporter(story);
+ reporter.AddResult(kMetricIterateResourcesRunsPerS, timer_.LapsPerSecond());
CleanUpRenderPass();
}
diff --git a/chromium/components/viz/common/quads/draw_quad_unittest.cc b/chromium/components/viz/common/quads/draw_quad_unittest.cc
index 197e9dd884e..2ee5914e94e 100644
--- a/chromium/components/viz/common/quads/draw_quad_unittest.cc
+++ b/chromium/components/viz/common/quads/draw_quad_unittest.cc
@@ -161,11 +161,11 @@ void CompareDrawQuad(DrawQuad* quad, DrawQuad* copy) {
} \
SETUP_AND_COPY_QUAD_ALL_RP(Type, quad_all, copy_a);
-#define CREATE_QUAD_NEW_RP(Type, a, b, c, d, e, f, g, h, i, j, k, copy_a) \
+#define CREATE_QUAD_NEW_RP(Type, a, b, c, d, e, f, g, h, i, j, copy_a) \
Type* quad_new = render_pass->CreateAndAppendDrawQuad<Type>(); \
{ \
QUAD_DATA quad_new->SetNew(shared_state, quad_rect, a, b, c, d, e, f, g, \
- h, i, j, k); \
+ h, i, j); \
} \
SETUP_AND_COPY_QUAD_NEW_RP(Type, quad_new, copy_a);
@@ -193,7 +193,6 @@ TEST(DrawQuadTest, CopyRenderPassDrawQuad) {
ResourceId mask_resource_id = 78;
gfx::RectF mask_uv_rect(0, 0, 33.f, 19.f);
gfx::Size mask_texture_size(128, 134);
- bool mask_applies_to_backdrop = false;
gfx::Vector2dF filters_scale;
gfx::PointF filters_origin;
gfx::RectF tex_coord_rect(1, 1, 255, 254);
@@ -205,34 +204,16 @@ TEST(DrawQuadTest, CopyRenderPassDrawQuad) {
CREATE_QUAD_NEW_RP(RenderPassDrawQuad, visible_rect, render_pass_id,
mask_resource_id, mask_uv_rect, mask_texture_size,
- mask_applies_to_backdrop, filters_scale, filters_origin,
- tex_coord_rect, force_anti_aliasing_off,
- backdrop_filter_quality, copied_render_pass_id);
- EXPECT_EQ(DrawQuad::Material::kRenderPass, copy_quad->material);
- EXPECT_EQ(visible_rect, copy_quad->visible_rect);
- EXPECT_EQ(copied_render_pass_id, copy_quad->render_pass_id);
- EXPECT_EQ(mask_resource_id, copy_quad->mask_resource_id());
- EXPECT_EQ(mask_uv_rect.ToString(), copy_quad->mask_uv_rect.ToString());
- EXPECT_EQ(mask_texture_size.ToString(),
- copy_quad->mask_texture_size.ToString());
- EXPECT_EQ(mask_applies_to_backdrop, copy_quad->mask_applies_to_backdrop);
- EXPECT_EQ(filters_scale, copy_quad->filters_scale);
- EXPECT_EQ(filters_origin, copy_quad->filters_origin);
- EXPECT_EQ(tex_coord_rect.ToString(), copy_quad->tex_coord_rect.ToString());
-
- mask_applies_to_backdrop = true;
- CREATE_QUAD_ALL_RP(RenderPassDrawQuad, render_pass_id, mask_resource_id,
- mask_uv_rect, mask_texture_size, mask_applies_to_backdrop,
filters_scale, filters_origin, tex_coord_rect,
force_anti_aliasing_off, backdrop_filter_quality,
copied_render_pass_id);
EXPECT_EQ(DrawQuad::Material::kRenderPass, copy_quad->material);
+ EXPECT_EQ(visible_rect, copy_quad->visible_rect);
EXPECT_EQ(copied_render_pass_id, copy_quad->render_pass_id);
EXPECT_EQ(mask_resource_id, copy_quad->mask_resource_id());
EXPECT_EQ(mask_uv_rect.ToString(), copy_quad->mask_uv_rect.ToString());
EXPECT_EQ(mask_texture_size.ToString(),
copy_quad->mask_texture_size.ToString());
- EXPECT_EQ(mask_applies_to_backdrop, copy_quad->mask_applies_to_backdrop);
EXPECT_EQ(filters_scale, copy_quad->filters_scale);
EXPECT_EQ(filters_origin, copy_quad->filters_origin);
EXPECT_EQ(tex_coord_rect.ToString(), copy_quad->tex_coord_rect.ToString());
@@ -548,7 +529,6 @@ TEST_F(DrawQuadIteratorTest, RenderPassDrawQuad) {
ResourceId mask_resource_id = 78;
gfx::RectF mask_uv_rect(0.f, 0.f, 33.f, 19.f);
gfx::Size mask_texture_size(128, 134);
- bool mask_applies_to_backdrop = false;
gfx::Vector2dF filters_scale(2.f, 3.f);
gfx::PointF filters_origin(0.f, 0.f);
gfx::RectF tex_coord_rect(1.f, 1.f, 33.f, 19.f);
@@ -560,33 +540,19 @@ TEST_F(DrawQuadIteratorTest, RenderPassDrawQuad) {
CREATE_SHARED_STATE();
CREATE_QUAD_NEW_RP(RenderPassDrawQuad, visible_rect, render_pass_id,
mask_resource_id, mask_uv_rect, mask_texture_size,
- mask_applies_to_backdrop, filters_scale, filters_origin,
- tex_coord_rect, force_anti_aliasing_off,
- backdrop_filter_quality, copied_render_pass_id);
- EXPECT_EQ(mask_resource_id, quad_new->mask_resource_id());
- EXPECT_EQ(1, IterateAndCount(quad_new));
- EXPECT_EQ(mask_resource_id + 1, quad_new->mask_resource_id());
- EXPECT_EQ(mask_applies_to_backdrop, quad_new->mask_applies_to_backdrop);
-
- mask_applies_to_backdrop = true;
- quad_new->SetNew(shared_state, visible_rect, visible_rect, render_pass_id,
- mask_resource_id, mask_uv_rect, mask_texture_size,
- mask_applies_to_backdrop, filters_scale, filters_origin,
- tex_coord_rect, force_anti_aliasing_off,
- backdrop_filter_quality);
+ filters_scale, filters_origin, tex_coord_rect,
+ force_anti_aliasing_off, backdrop_filter_quality,
+ copied_render_pass_id);
EXPECT_EQ(mask_resource_id, quad_new->mask_resource_id());
EXPECT_EQ(1, IterateAndCount(quad_new));
EXPECT_EQ(mask_resource_id + 1, quad_new->mask_resource_id());
- EXPECT_EQ(mask_applies_to_backdrop, quad_new->mask_applies_to_backdrop);
- mask_applies_to_backdrop = false;
ResourceId new_mask_resource_id = 0;
gfx::Rect quad_rect(30, 40, 50, 60);
quad_new->SetNew(shared_state, quad_rect, visible_rect, render_pass_id,
new_mask_resource_id, mask_uv_rect, mask_texture_size,
- mask_applies_to_backdrop, filters_scale, filters_origin,
- tex_coord_rect, force_anti_aliasing_off,
- backdrop_filter_quality);
+ filters_scale, filters_origin, tex_coord_rect,
+ force_anti_aliasing_off, backdrop_filter_quality);
EXPECT_EQ(0, IterateAndCount(quad_new));
EXPECT_EQ(0u, quad_new->mask_resource_id());
}
diff --git a/chromium/components/viz/common/quads/render_pass_draw_quad.cc b/chromium/components/viz/common/quads/render_pass_draw_quad.cc
index d2e5017f7fa..096a0013037 100644
--- a/chromium/components/viz/common/quads/render_pass_draw_quad.cc
+++ b/chromium/components/viz/common/quads/render_pass_draw_quad.cc
@@ -26,7 +26,6 @@ void RenderPassDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
ResourceId mask_resource_id,
const gfx::RectF& mask_uv_rect,
const gfx::Size& mask_texture_size,
- bool mask_applies_to_backdrop,
const gfx::Vector2dF& filters_scale,
const gfx::PointF& filters_origin,
const gfx::RectF& tex_coord_rect,
@@ -36,9 +35,9 @@ void RenderPassDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
bool needs_blending = true;
SetAll(shared_quad_state, rect, visible_rect, needs_blending, render_pass_id,
- mask_resource_id, mask_uv_rect, mask_texture_size,
- mask_applies_to_backdrop, filters_scale, filters_origin,
- tex_coord_rect, force_anti_aliasing_off, backdrop_filter_quality);
+ mask_resource_id, mask_uv_rect, mask_texture_size, filters_scale,
+ filters_origin, tex_coord_rect, force_anti_aliasing_off,
+ backdrop_filter_quality);
}
void RenderPassDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
@@ -49,7 +48,6 @@ void RenderPassDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
ResourceId mask_resource_id,
const gfx::RectF& mask_uv_rect,
const gfx::Size& mask_texture_size,
- bool mask_applies_to_backdrop,
const gfx::Vector2dF& filters_scale,
const gfx::PointF& filters_origin,
const gfx::RectF& tex_coord_rect,
@@ -64,7 +62,6 @@ void RenderPassDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
resources.count = mask_resource_id ? 1 : 0;
this->mask_uv_rect = mask_uv_rect;
this->mask_texture_size = mask_texture_size;
- this->mask_applies_to_backdrop = mask_applies_to_backdrop;
this->filters_scale = filters_scale;
this->filters_origin = filters_origin;
this->tex_coord_rect = tex_coord_rect;
@@ -85,7 +82,6 @@ void RenderPassDrawQuad::ExtendValue(
value->SetInteger("mask_resource_id", resources.ids[kMaskResourceIdIndex]);
cc::MathUtil::AddToTracedValue("mask_texture_size", mask_texture_size, value);
cc::MathUtil::AddToTracedValue("mask_uv_rect", mask_uv_rect, value);
- value->SetBoolean("mask_applies_to_backdrop", mask_applies_to_backdrop);
cc::MathUtil::AddToTracedValue("tex_coord_rect", tex_coord_rect, value);
value->SetBoolean("force_anti_aliasing_off", force_anti_aliasing_off);
value->SetDouble("backdrop_filter_quality", backdrop_filter_quality);
diff --git a/chromium/components/viz/common/quads/render_pass_draw_quad.h b/chromium/components/viz/common/quads/render_pass_draw_quad.h
index ccb08c375d2..6d68a8d25bf 100644
--- a/chromium/components/viz/common/quads/render_pass_draw_quad.h
+++ b/chromium/components/viz/common/quads/render_pass_draw_quad.h
@@ -34,7 +34,6 @@ class VIZ_COMMON_EXPORT RenderPassDrawQuad : public DrawQuad {
ResourceId mask_resource_id,
const gfx::RectF& mask_uv_rect,
const gfx::Size& mask_texture_size,
- bool mask_applies_to_backdrop,
const gfx::Vector2dF& filters_scale,
const gfx::PointF& filters_origin,
const gfx::RectF& tex_coord_rect,
@@ -49,7 +48,6 @@ class VIZ_COMMON_EXPORT RenderPassDrawQuad : public DrawQuad {
ResourceId mask_resource_id,
const gfx::RectF& mask_uv_rect,
const gfx::Size& mask_texture_size,
- bool mask_applies_to_backdrop,
const gfx::Vector2dF& filters_scale,
const gfx::PointF& filters_origin,
const gfx::RectF& tex_coord_rect,
@@ -75,7 +73,6 @@ class VIZ_COMMON_EXPORT RenderPassDrawQuad : public DrawQuad {
float backdrop_filter_quality;
bool force_anti_aliasing_off;
- bool mask_applies_to_backdrop;
ResourceId mask_resource_id() const {
return resources.ids[kMaskResourceIdIndex];
diff --git a/chromium/components/viz/common/quads/render_pass_unittest.cc b/chromium/components/viz/common/quads/render_pass_unittest.cc
index 3f083eb2af5..48a39eacc2d 100644
--- a/chromium/components/viz/common/quads/render_pass_unittest.cc
+++ b/chromium/components/viz/common/quads/render_pass_unittest.cc
@@ -227,8 +227,8 @@ TEST(RenderPassTest, CopyAllShouldBeIdentical) {
auto pass_quad = std::make_unique<RenderPassDrawQuad>();
pass_quad->SetNew(pass->shared_quad_state_list.back(), contrib_output_rect,
contrib_output_rect, contrib_id, 0, gfx::RectF(),
- gfx::Size(), false, gfx::Vector2dF(), gfx::PointF(),
- gfx::RectF(), false, 1.0f);
+ gfx::Size(), gfx::Vector2dF(), gfx::PointF(), gfx::RectF(),
+ false, 1.0f);
pass_list.push_back(std::move(pass));
pass_list.push_back(std::move(contrib));
diff --git a/chromium/components/viz/common/quads/stream_video_draw_quad.cc b/chromium/components/viz/common/quads/stream_video_draw_quad.cc
index bf1eae90957..57f3feebe5e 100644
--- a/chromium/components/viz/common/quads/stream_video_draw_quad.cc
+++ b/chromium/components/viz/common/quads/stream_video_draw_quad.cc
@@ -16,16 +16,14 @@ StreamVideoDrawQuad::~StreamVideoDrawQuad() = default;
StreamVideoDrawQuad::StreamVideoDrawQuad(const StreamVideoDrawQuad& quad) =
default;
-void StreamVideoDrawQuad::SetNew(
- const SharedQuadState* shared_quad_state,
- const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- bool needs_blending,
- unsigned resource_id,
- gfx::Size resource_size_in_pixels,
- const gfx::PointF& uv_top_left,
- const gfx::PointF& uv_bottom_right,
- const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info) {
+void StreamVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
+ const gfx::Rect& rect,
+ const gfx::Rect& visible_rect,
+ bool needs_blending,
+ unsigned resource_id,
+ gfx::Size resource_size_in_pixels,
+ const gfx::PointF& uv_top_left,
+ const gfx::PointF& uv_bottom_right) {
DrawQuad::SetAll(shared_quad_state, DrawQuad::Material::kStreamVideoContent,
rect, visible_rect, needs_blending);
resources.ids[kResourceIdIndex] = resource_id;
@@ -33,7 +31,6 @@ void StreamVideoDrawQuad::SetNew(
resources.count = 1;
this->uv_top_left = uv_top_left;
this->uv_bottom_right = uv_bottom_right;
- this->ycbcr_info = ycbcr_info;
}
void StreamVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
diff --git a/chromium/components/viz/common/quads/stream_video_draw_quad.h b/chromium/components/viz/common/quads/stream_video_draw_quad.h
index 3e67e7ad9e5..a35bda2902f 100644
--- a/chromium/components/viz/common/quads/stream_video_draw_quad.h
+++ b/chromium/components/viz/common/quads/stream_video_draw_quad.h
@@ -24,16 +24,14 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad {
~StreamVideoDrawQuad() override;
StreamVideoDrawQuad(const StreamVideoDrawQuad& quad);
- void SetNew(
- const SharedQuadState* shared_quad_state,
- const gfx::Rect& rect,
- const gfx::Rect& visible_rect,
- bool needs_blending,
- unsigned resource_id,
- gfx::Size resource_size_in_pixels,
- const gfx::PointF& uv_top_left,
- const gfx::PointF& uv_bottom_right,
- const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info = base::nullopt);
+ void SetNew(const SharedQuadState* shared_quad_state,
+ const gfx::Rect& rect,
+ const gfx::Rect& visible_rect,
+ bool needs_blending,
+ unsigned resource_id,
+ gfx::Size resource_size_in_pixels,
+ const gfx::PointF& uv_top_left,
+ const gfx::PointF& uv_bottom_right);
void SetAll(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect,
@@ -53,9 +51,6 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad {
};
OverlayResources overlay_resources;
- // Sampler conversion information which is used in vulkan context for android.
- base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
-
static const StreamVideoDrawQuad* MaterialCast(const DrawQuad*);
ResourceId resource_id() const { return resources.ids[kResourceIdIndex]; }
diff --git a/chromium/components/viz/common/resources/DEPS b/chromium/components/viz/common/resources/DEPS
index d6e39ea70d7..972774c5325 100644
--- a/chromium/components/viz/common/resources/DEPS
+++ b/chromium/components/viz/common/resources/DEPS
@@ -5,6 +5,7 @@ include_rules = [
# cc::MathUtil. Remove it once cc/base/math_util* are moved to viz.
"+cc/base",
"+gpu/command_buffer/common",
+ "+gpu/ipc/common",
"+gpu/vulkan/buildflags.h",
"+gpu/GLES2",
"+mojo/public/cpp/system/buffer.h",
diff --git a/chromium/components/viz/common/resources/resource_format.h b/chromium/components/viz/common/resources/resource_format.h
index c1de1f293dd..e5f18e224b4 100644
--- a/chromium/components/viz/common/resources/resource_format.h
+++ b/chromium/components/viz/common/resources/resource_format.h
@@ -29,7 +29,6 @@ enum ResourceFormat {
BGRX_1010102,
YVU_420,
YUV_420_BIPLANAR,
- UYVY_422,
P010,
RESOURCE_FORMAT_MAX = P010,
};
diff --git a/chromium/components/viz/common/resources/resource_format_utils.cc b/chromium/components/viz/common/resources/resource_format_utils.cc
index 6d0fe7527d2..c145ddf5537 100644
--- a/chromium/components/viz/common/resources/resource_format_utils.cc
+++ b/chromium/components/viz/common/resources/resource_format_utils.cc
@@ -23,7 +23,6 @@ SkColorType ResourceFormatToClosestSkColorType(bool gpu_compositing,
return kN32_SkColorType;
}
- // Use kN32_SkColorType if there is no corresponding SkColorType.
switch (format) {
case RGBA_4444:
return kARGB_4444_SkColorType;
@@ -40,19 +39,26 @@ SkColorType ResourceFormatToClosestSkColorType(bool gpu_compositing,
case RGBX_8888:
case ETC1:
return kRGB_888x_SkColorType;
+ case RGBX_1010102:
+ case BGRX_1010102:
+ return kRGBA_1010102_SkColorType;
+
+ // YUV images are sampled as RGB.
+ case YVU_420:
+ case YUV_420_BIPLANAR:
+ return kRGB_888x_SkColorType;
+
+ // Use kN32_SkColorType if there is no corresponding SkColorType.
case RED_8:
+ return kGray_8_SkColorType;
case LUMINANCE_F16:
case R16_EXT:
case BGR_565:
case RG_88:
case BGRX_8888:
- case RGBX_1010102:
- case BGRX_1010102:
- case YVU_420:
- case YUV_420_BIPLANAR:
- case UYVY_422:
case P010:
return kN32_SkColorType;
+
case RGBA_F16:
return kRGBA_F16_SkColorType;
}
@@ -78,7 +84,6 @@ int BitsPerPixel(ResourceFormat format) {
case R16_EXT:
case BGR_565:
case RG_88:
- case UYVY_422:
return 16;
case YVU_420:
case YUV_420_BIPLANAR:
@@ -94,6 +99,35 @@ int BitsPerPixel(ResourceFormat format) {
return 0;
}
+bool HasAlpha(ResourceFormat format) {
+ switch (format) {
+ case RGBA_8888:
+ case RGBA_4444:
+ case BGRA_8888:
+ case ALPHA_8:
+ case RGBA_F16:
+ return true;
+ case LUMINANCE_8:
+ case RGB_565:
+ case BGR_565:
+ case ETC1:
+ case RED_8:
+ case RG_88:
+ case LUMINANCE_F16:
+ case R16_EXT:
+ case RGBX_8888:
+ case BGRX_8888:
+ case RGBX_1010102:
+ case BGRX_1010102:
+ case YVU_420:
+ case YUV_420_BIPLANAR:
+ case P010:
+ return false;
+ }
+ NOTREACHED();
+ return false;
+}
+
unsigned int GLDataType(ResourceFormat format) {
DCHECK_LE(format, RESOURCE_FORMAT_MAX);
static const GLenum format_gl_data_type[] = {
@@ -116,7 +150,6 @@ unsigned int GLDataType(ResourceFormat format) {
GL_ZERO, // BGRX_1010102
GL_ZERO, // YVU_420
GL_ZERO, // YUV_420_BIPLANAR
- GL_ZERO, // UYVY_422
GL_ZERO, // P010
};
static_assert(base::size(format_gl_data_type) == (RESOURCE_FORMAT_MAX + 1),
@@ -147,7 +180,6 @@ unsigned int GLDataFormat(ResourceFormat format) {
GL_ZERO, // BGRX_1010102
GL_ZERO, // YVU_420
GL_ZERO, // YUV_420_BIPLANAR
- GL_ZERO, // UYVY_422
GL_ZERO, // P010
};
static_assert(base::size(format_gl_data_format) == (RESOURCE_FORMAT_MAX + 1),
@@ -199,7 +231,6 @@ unsigned int GLCopyTextureInternalFormat(ResourceFormat format) {
GL_ZERO, // BGRX_1010102
GL_ZERO, // YVU_420
GL_ZERO, // YUV_420_BIPLANAR
- GL_ZERO, // UYVY_422
GL_ZERO, // P010
};
@@ -241,7 +272,6 @@ gfx::BufferFormat BufferFormat(ResourceFormat format) {
return gfx::BufferFormat::YUV_420_BIPLANAR;
case P010:
return gfx::BufferFormat::P010;
- case UYVY_422:
case ETC1:
case ALPHA_8:
case LUMINANCE_8:
@@ -286,13 +316,12 @@ unsigned int TextureStorageFormat(ResourceFormat format) {
case ETC1:
return GL_RGB8_OES;
case RGBX_1010102:
+ case BGRX_1010102:
return GL_RGB10_A2_EXT;
case BGR_565:
case BGRX_8888:
- case BGRX_1010102:
case YVU_420:
case YUV_420_BIPLANAR:
- case UYVY_422:
case P010:
break;
}
@@ -324,7 +353,6 @@ bool IsGpuMemoryBufferFormatSupported(ResourceFormat format) {
case BGRX_1010102:
case YVU_420:
case YUV_420_BIPLANAR:
- case UYVY_422:
case P010:
return false;
}
@@ -354,7 +382,6 @@ bool IsBitmapFormatSupported(ResourceFormat format) {
case BGRX_1010102:
case YVU_420:
case YUV_420_BIPLANAR:
- case UYVY_422:
case P010:
return false;
}
@@ -406,7 +433,6 @@ bool GLSupportsFormat(ResourceFormat format) {
case BGRX_1010102:
case YVU_420:
case YUV_420_BIPLANAR:
- case UYVY_422:
case P010:
return false;
default:
@@ -440,9 +466,9 @@ VkFormat ToVkFormat(ResourceFormat format) {
case BGRX_8888:
return VK_FORMAT_B8G8R8A8_UNORM;
case RGBX_1010102:
- return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
- case BGRX_1010102:
return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
+ case BGRX_1010102:
+ return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
case ALPHA_8:
return VK_FORMAT_R8_UNORM;
case LUMINANCE_8:
@@ -451,9 +477,9 @@ VkFormat ToVkFormat(ResourceFormat format) {
return VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
case YUV_420_BIPLANAR:
return VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
- case LUMINANCE_F16:
- case UYVY_422:
case ETC1:
+ return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
+ case LUMINANCE_F16:
case P010:
break;
}
diff --git a/chromium/components/viz/common/resources/resource_format_utils.h b/chromium/components/viz/common/resources/resource_format_utils.h
index a4e354b3198..45866c098d4 100644
--- a/chromium/components/viz/common/resources/resource_format_utils.h
+++ b/chromium/components/viz/common/resources/resource_format_utils.h
@@ -21,6 +21,7 @@ namespace viz {
VIZ_RESOURCE_FORMAT_EXPORT SkColorType
ResourceFormatToClosestSkColorType(bool gpu_compositing, ResourceFormat format);
VIZ_RESOURCE_FORMAT_EXPORT int BitsPerPixel(ResourceFormat format);
+VIZ_RESOURCE_FORMAT_EXPORT bool HasAlpha(ResourceFormat format);
// The following functions use unsigned int instead of GLenum, since including
// third_party/khronos/GLES2/gl2.h causes redefinition errors as
diff --git a/chromium/components/viz/common/resources/resource_sizes.h b/chromium/components/viz/common/resources/resource_sizes.h
index b7491b0a842..4acfae5e663 100644
--- a/chromium/components/viz/common/resources/resource_sizes.h
+++ b/chromium/components/viz/common/resources/resource_sizes.h
@@ -71,18 +71,37 @@ class VIZ_RESOURCE_FORMAT_EXPORT ResourceSizes {
static inline void VerifyType();
template <typename T>
- static bool VerifyFitsInBytesInternal(int width,
- int height,
+ static bool VerifyWidthInBytesInternal(int width,
+ ResourceFormat format,
+ bool aligned);
+
+ template <typename T>
+ static bool VerifySizeInBytesInternal(const gfx::Size& size,
ResourceFormat format,
- bool verify_size,
bool aligned);
template <typename T>
- static T BytesInternal(int width,
- int height,
- ResourceFormat format,
- bool verify_size,
- bool aligned);
+ static bool MaybeWidthInBytesInternal(int width,
+ ResourceFormat format,
+ bool aligned,
+ T* bytes);
+
+ template <typename T>
+ static bool MaybeSizeInBytesInternal(const gfx::Size& size,
+ ResourceFormat format,
+ bool aligned,
+ T* bytes);
+
+ template <typename T>
+ static T WidthInBytesInternal(int width, ResourceFormat format, bool aligned);
+
+ template <typename T>
+ static T SizeInBytesInternal(const gfx::Size& size,
+ ResourceFormat format,
+ bool aligned);
+
+ template <typename T>
+ static bool MaybeRound(base::CheckedNumeric<T>* value, T mul);
// Not instantiable.
ResourceSizes() = delete;
@@ -93,7 +112,7 @@ bool ResourceSizes::VerifyWidthInBytes(int width, ResourceFormat format) {
VerifyType<T>();
if (width <= 0)
return false;
- return VerifyFitsInBytesInternal<T>(width, 0, format, false, false);
+ return VerifyWidthInBytesInternal<T>(width, format, false);
}
template <typename T>
@@ -102,8 +121,7 @@ bool ResourceSizes::VerifySizeInBytes(const gfx::Size& size,
VerifyType<T>();
if (size.IsEmpty())
return false;
- return VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
- false);
+ return VerifySizeInBytesInternal<T>(size, format, false);
}
template <typename T>
@@ -113,15 +131,7 @@ bool ResourceSizes::MaybeWidthInBytes(int width,
VerifyType<T>();
if (width <= 0)
return false;
- base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
- checked_value *= width;
- checked_value =
- cc::MathUtil::CheckedRoundUp<T>(checked_value.ValueOrDie(), 8);
- checked_value /= 8;
- if (!checked_value.IsValid())
- return false;
- *bytes = checked_value.ValueOrDie();
- return true;
+ return MaybeWidthInBytesInternal<T>(width, format, false, bytes);
}
template <typename T>
@@ -131,29 +141,16 @@ bool ResourceSizes::MaybeSizeInBytes(const gfx::Size& size,
VerifyType<T>();
if (size.IsEmpty())
return false;
- base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
- checked_value *= size.width();
- checked_value =
- cc::MathUtil::CheckedRoundUp<T>(checked_value.ValueOrDie(), 8);
- checked_value /= 8;
- checked_value *= size.height();
- if (!checked_value.IsValid())
- return false;
- *bytes = checked_value.ValueOrDie();
- return true;
+ return MaybeSizeInBytesInternal<T>(size, format, false, bytes);
}
template <typename T>
T ResourceSizes::CheckedWidthInBytes(int width, ResourceFormat format) {
VerifyType<T>();
CHECK_GT(width, 0);
- DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false));
- base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
- checked_value *= width;
- checked_value =
- cc::MathUtil::CheckedRoundUp<T>(checked_value.ValueOrDie(), 8);
- checked_value /= 8;
- return checked_value.ValueOrDie();
+ T bytes;
+ CHECK(MaybeWidthInBytesInternal<T>(width, format, false, &bytes));
+ return bytes;
}
template <typename T>
@@ -161,23 +158,17 @@ T ResourceSizes::CheckedSizeInBytes(const gfx::Size& size,
ResourceFormat format) {
VerifyType<T>();
CHECK(!size.IsEmpty());
- DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
- false));
- base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
- checked_value *= size.width();
- checked_value =
- cc::MathUtil::CheckedRoundUp<T>(checked_value.ValueOrDie(), 8);
- checked_value /= 8;
- checked_value *= size.height();
- return checked_value.ValueOrDie();
+ T bytes;
+ CHECK(MaybeSizeInBytesInternal<T>(size, format, false, &bytes));
+ return bytes;
}
template <typename T>
T ResourceSizes::UncheckedWidthInBytes(int width, ResourceFormat format) {
VerifyType<T>();
DCHECK_GT(width, 0);
- DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, false));
- return BytesInternal<T>(width, 0, format, false, false);
+ DCHECK(VerifyWidthInBytesInternal<T>(width, format, false));
+ return WidthInBytesInternal<T>(width, format, false);
}
template <typename T>
@@ -185,9 +176,8 @@ T ResourceSizes::UncheckedSizeInBytes(const gfx::Size& size,
ResourceFormat format) {
VerifyType<T>();
DCHECK(!size.IsEmpty());
- DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
- false));
- return BytesInternal<T>(size.width(), size.height(), format, true, false);
+ DCHECK(VerifySizeInBytesInternal<T>(size, format, false));
+ return SizeInBytesInternal<T>(size, format, false);
}
template <typename T>
@@ -195,8 +185,8 @@ T ResourceSizes::UncheckedWidthInBytesAligned(int width,
ResourceFormat format) {
VerifyType<T>();
DCHECK_GT(width, 0);
- DCHECK(VerifyFitsInBytesInternal<T>(width, 0, format, false, true));
- return BytesInternal<T>(width, 0, format, false, true);
+ DCHECK(VerifyWidthInBytesInternal<T>(width, format, true));
+ return WidthInBytesInternal<T>(width, format, true);
}
template <typename T>
@@ -204,9 +194,8 @@ T ResourceSizes::UncheckedSizeInBytesAligned(const gfx::Size& size,
ResourceFormat format) {
VerifyType<T>();
CHECK(!size.IsEmpty());
- DCHECK(VerifyFitsInBytesInternal<T>(size.width(), size.height(), format, true,
- true));
- return BytesInternal<T>(size.width(), size.height(), format, true, true);
+ DCHECK(VerifySizeInBytesInternal<T>(size, format, true));
+ return SizeInBytesInternal<T>(size, format, true);
}
template <typename T>
@@ -217,61 +206,107 @@ void ResourceSizes::VerifyType() {
}
template <typename T>
-bool ResourceSizes::VerifyFitsInBytesInternal(int width,
- int height,
+bool ResourceSizes::VerifyWidthInBytesInternal(int width,
+ ResourceFormat format,
+ bool aligned) {
+ T ignored;
+ return MaybeWidthInBytesInternal(width, format, aligned, &ignored);
+}
+
+template <typename T>
+bool ResourceSizes::VerifySizeInBytesInternal(const gfx::Size& size,
ResourceFormat format,
- bool verify_size,
bool aligned) {
- base::CheckedNumeric<T> checked_value = BitsPerPixel(format);
- checked_value *= width;
- if (!checked_value.IsValid())
+ T ignored;
+ return MaybeSizeInBytesInternal(size, format, aligned, &ignored);
+}
+
+template <typename T>
+bool ResourceSizes::MaybeWidthInBytesInternal(int width,
+ ResourceFormat format,
+ bool aligned,
+ T* bytes) {
+ base::CheckedNumeric<T> bits_per_row = BitsPerPixel(format);
+ bits_per_row *= width;
+ if (!bits_per_row.IsValid())
return false;
// Roundup bits to byte (8 bits) boundary. If width is 3 and BitsPerPixel is
// 4, then it should return 16, so that row pixels do not get truncated.
- checked_value =
- cc::MathUtil::UncheckedRoundUp<T>(checked_value.ValueOrDie(), 8);
+ if (!MaybeRound<T>(&bits_per_row, 8))
+ return false;
+
+ // Convert to bytes by dividing by 8. This can't fail as we've rounded to a
+ // multiple of 8 above.
+ base::CheckedNumeric<T> bytes_per_row = bits_per_row / 8;
+ DCHECK(bytes_per_row.IsValid());
// If aligned is true, bytes are aligned on 4-bytes boundaries for upload
// performance, assuming that GL_PACK_ALIGNMENT or GL_UNPACK_ALIGNMENT have
// not changed from default.
if (aligned) {
- checked_value /= 8;
- if (!checked_value.IsValid())
- return false;
- checked_value =
- cc::MathUtil::UncheckedRoundUp<T>(checked_value.ValueOrDie(), 4);
- checked_value *= 8;
+ // This can't fail as we've just divided by 8, so we can always round up to
+ // the nearest multiple of 4.
+ bool succeeded = MaybeRound<T>(&bytes_per_row, 4);
+ DCHECK(succeeded);
}
- if (verify_size)
- checked_value *= height;
- if (!checked_value.IsValid())
+ *bytes = bytes_per_row.ValueOrDie();
+ return true;
+}
+
+template <typename T>
+bool ResourceSizes::MaybeSizeInBytesInternal(const gfx::Size& size,
+ ResourceFormat format,
+ bool aligned,
+ T* bytes) {
+ T width_in_bytes;
+ if (!MaybeWidthInBytesInternal<T>(size.width(), format, aligned,
+ &width_in_bytes)) {
return false;
- T value = checked_value.ValueOrDie();
- if ((value % 8) != 0)
+ }
+
+ base::CheckedNumeric<T> total_bytes = width_in_bytes;
+ total_bytes *= size.height();
+ if (!total_bytes.IsValid())
return false;
+
+ *bytes = total_bytes.ValueOrDie();
return true;
}
template <typename T>
-T ResourceSizes::BytesInternal(int width,
- int height,
- ResourceFormat format,
- bool verify_size,
- bool aligned) {
+T ResourceSizes::WidthInBytesInternal(int width,
+ ResourceFormat format,
+ bool aligned) {
T bytes = BitsPerPixel(format);
bytes *= width;
bytes = cc::MathUtil::UncheckedRoundUp<T>(bytes, 8);
bytes /= 8;
if (aligned)
bytes = cc::MathUtil::UncheckedRoundUp<T>(bytes, 4);
- if (verify_size)
- bytes *= height;
+ return bytes;
+}
+template <typename T>
+T ResourceSizes::SizeInBytesInternal(const gfx::Size& size,
+ ResourceFormat format,
+ bool aligned) {
+ T bytes = WidthInBytesInternal<T>(size.width(), format, aligned);
+ bytes *= size.height();
return bytes;
}
+template <typename T>
+bool ResourceSizes::MaybeRound(base::CheckedNumeric<T>* value, T mul) {
+ DCHECK(value->IsValid());
+ T to_round = value->ValueOrDie();
+ if (!cc::MathUtil::VerifyRoundup<T>(to_round, mul))
+ return false;
+ *value = cc::MathUtil::UncheckedRoundUp<T>(to_round, mul);
+ return true;
+}
+
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_SIZES_H_
diff --git a/chromium/components/viz/common/resources/resource_sizes_unittest.cc b/chromium/components/viz/common/resources/resource_sizes_unittest.cc
index 06fe461faee..d532f042d25 100644
--- a/chromium/components/viz/common/resources/resource_sizes_unittest.cc
+++ b/chromium/components/viz/common/resources/resource_sizes_unittest.cc
@@ -166,5 +166,31 @@ TEST_F(ResourceUtilTest, SizeInBytesOverflow) {
EXPECT_TRUE(ResourceSizes::VerifySizeInBytes<int>(size, RGBA_4444));
}
+TEST_F(ResourceUtilTest, WidthOverflowDoesNotCrash) {
+ gfx::Size size(0x20000000, 1);
+ // 0x20000000 * 4 = 0x80000000 which overflows int. Should return false, not
+ // crash.
+ int bytes;
+ EXPECT_FALSE(
+ ResourceSizes::MaybeWidthInBytes<int>(size.width(), BGRA_8888, &bytes));
+ EXPECT_FALSE(ResourceSizes::MaybeSizeInBytes<int>(size, BGRA_8888, &bytes));
+}
+
+// Checks that we do not incorrectly indicate that a size has overflowed when
+// only the size in bits overflows, but not the size in bytes.
+TEST_F(ResourceUtilTest, SizeInBitsOverflowBytesOk) {
+ gfx::Size size(10000, 10000);
+ // 8192 * 8192 * 32 = 0x80000000, overflows int.
+ // Bytes are /8 and do not overflow.
+ EXPECT_TRUE(ResourceSizes::VerifySizeInBytes<int>(size, BGRA_8888));
+}
+
+// Checks that we correctly identify overflow in cases caused by rounding.
+TEST_F(ResourceUtilTest, RoundingOverflows) {
+ gfx::Size size(0x1FFFFFFF, 1);
+ // 0x1FFFFFFF * 4 = 0x7FFFFFFC. Will overflow when rounded up.
+ EXPECT_FALSE(ResourceSizes::VerifySizeInBytes<int>(size, ETC1));
+}
+
} // namespace
} // namespace viz
diff --git a/chromium/components/viz/common/resources/transferable_resource.h b/chromium/components/viz/common/resources/transferable_resource.h
index e6547e73813..1f3c93e900e 100644
--- a/chromium/components/viz/common/resources/transferable_resource.h
+++ b/chromium/components/viz/common/resources/transferable_resource.h
@@ -15,6 +15,7 @@
#include "components/viz/common/resources/shared_bitmap.h"
#include "components/viz/common/viz_common_export.h"
#include "gpu/command_buffer/common/mailbox_holder.h"
+#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
@@ -104,6 +105,10 @@ struct VIZ_COMMON_EXPORT TransferableResource {
// out-of-band, and a gpu fence needs to be waited on before the resource is
// returned and reused.
bool read_lock_fences_enabled = false;
+
+ // YCbCr info for resources backed by YCbCr Vulkan images.
+ base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
+
#if defined(OS_ANDROID)
// Indicates whether this resource may not be overlayed on Android, since
// it's not backed by a SurfaceView. This may be set in combination with
diff --git a/chromium/components/viz/common/yuv_readback_unittest.cc b/chromium/components/viz/common/yuv_readback_unittest.cc
index 0e3116e561e..598f73b4e20 100644
--- a/chromium/components/viz/common/yuv_readback_unittest.cc
+++ b/chromium/components/viz/common/yuv_readback_unittest.cc
@@ -7,6 +7,7 @@
#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/numerics/ranges.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/strings/stringprintf.h"
@@ -133,14 +134,14 @@ class YUVReadbackTest : public testing::Test {
int Channel(SkBitmap* pixels, int x, int y, int c) {
if (pixels->bytesPerPixel() == 4) {
uint32_t* data =
- pixels->getAddr32(std::max(0, std::min(x, pixels->width() - 1)),
- std::max(0, std::min(y, pixels->height() - 1)));
+ pixels->getAddr32(base::ClampToRange(x, 0, pixels->width() - 1),
+ base::ClampToRange(y, 0, pixels->height() - 1));
return (*data) >> (c * 8) & 0xff;
} else {
DCHECK_EQ(pixels->bytesPerPixel(), 1);
DCHECK_EQ(c, 0);
- return *pixels->getAddr8(std::max(0, std::min(x, pixels->width() - 1)),
- std::max(0, std::min(y, pixels->height() - 1)));
+ return *pixels->getAddr8(base::ClampToRange(x, 0, pixels->width() - 1),
+ base::ClampToRange(y, 0, pixels->height() - 1));
}
}
@@ -153,13 +154,13 @@ class YUVReadbackTest : public testing::Test {
DCHECK_LT(y, pixels->height());
if (pixels->bytesPerPixel() == 4) {
uint32_t* data = pixels->getAddr32(x, y);
- v = std::max(0, std::min(v, 255));
+ v = base::ClampToRange(v, 0, 255);
*data = (*data & ~(0xffu << (c * 8))) | (v << (c * 8));
} else {
DCHECK_EQ(pixels->bytesPerPixel(), 1);
DCHECK_EQ(c, 0);
uint8_t* data = pixels->getAddr8(x, y);
- v = std::max(0, std::min(v, 255));
+ v = base::ClampToRange(v, 0, 255);
*data = v;
}
}