blob: dbf9b8834b82a532b278414467f130f050aca39d [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/service/display_embedder/skia_output_surface_base.h"
#include "build/build_config.h"
#include "components/viz/service/display/output_surface_frame.h"
#include "components/viz/service/display/resource_metadata.h"
#include "components/viz/service/display_embedder/image_context.h"
#include "components/viz/service/gl/gpu_service_impl.h"
#include "ui/gl/gl_bindings.h"
namespace viz {
SkiaOutputSurfaceBase::SkiaOutputSurfaceBase() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
SkiaOutputSurfaceBase::~SkiaOutputSurfaceBase() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
void SkiaOutputSurfaceBase::BindToClient(OutputSurfaceClient* client) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(client);
DCHECK(!client_);
client_ = client;
}
void SkiaOutputSurfaceBase::BindFramebuffer() {
// TODO(penghuang): remove this method when GLRenderer is removed.
}
void SkiaOutputSurfaceBase::SetDrawRectangle(const gfx::Rect& draw_rectangle) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
// This GLSurface::SetDrawRectangle is a no-op for all GLSurface subclasses
// except DirectCompositionSurfaceWin.
#if defined(OS_WIN)
NOTIMPLEMENTED();
#endif
}
void SkiaOutputSurfaceBase::SwapBuffers(OutputSurfaceFrame frame) {
NOTREACHED();
}
uint32_t SkiaOutputSurfaceBase::GetFramebufferCopyTextureFormat() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return GL_RGB;
}
bool SkiaOutputSurfaceBase::IsDisplayedAsOverlayPlane() const {
return false;
}
unsigned SkiaOutputSurfaceBase::GetOverlayTextureId() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return 0;
}
gfx::BufferFormat SkiaOutputSurfaceBase::GetOverlayBufferFormat() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return gfx::BufferFormat::RGBX_8888;
}
bool SkiaOutputSurfaceBase::HasExternalStencilTest() const {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return false;
}
void SkiaOutputSurfaceBase::ApplyExternalStencil() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
}
unsigned SkiaOutputSurfaceBase::UpdateGpuFence() {
return 0;
}
void SkiaOutputSurfaceBase::SetNeedsSwapSizeNotifications(
bool needs_swap_size_notifications) {
needs_swap_size_notifications_ = needs_swap_size_notifications;
}
void SkiaOutputSurfaceBase::SetUpdateVSyncParametersCallback(
UpdateVSyncParametersCallback callback) {}
void SkiaOutputSurfaceBase::SetDisplayTransformHint(
gfx::OverlayTransform transform) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
// TODO(khushalsagar): Apply this transform if rendering using Vulkan.
}
gfx::OverlayTransform SkiaOutputSurfaceBase::GetDisplayTransform() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
return gfx::OVERLAY_TRANSFORM_NONE;
}
void SkiaOutputSurfaceBase::AddContextLostObserver(
ContextLostObserver* observer) {
observers_.AddObserver(observer);
}
void SkiaOutputSurfaceBase::RemoveContextLostObserver(
ContextLostObserver* observer) {
observers_.RemoveObserver(observer);
}
void SkiaOutputSurfaceBase::PrepareYUVATextureIndices(
const std::vector<ResourceMetadata>& metadatas,
bool has_alpha,
SkYUVAIndex indices[4]) {
DCHECK((has_alpha && (metadatas.size() == 3 || metadatas.size() == 4)) ||
(!has_alpha && (metadatas.size() == 2 || metadatas.size() == 3)));
bool uv_interleaved =
has_alpha ? metadatas.size() == 3 : metadatas.size() == 2;
indices[SkYUVAIndex::kY_Index].fIndex = 0;
indices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
if (uv_interleaved) {
indices[SkYUVAIndex::kU_Index].fIndex = 1;
indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
indices[SkYUVAIndex::kV_Index].fIndex = 1;
indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kG;
indices[SkYUVAIndex::kA_Index].fIndex = has_alpha ? 2 : -1;
indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
} else {
indices[SkYUVAIndex::kU_Index].fIndex = 1;
indices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
indices[SkYUVAIndex::kV_Index].fIndex = 2;
indices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR;
indices[SkYUVAIndex::kA_Index].fIndex = has_alpha ? 3 : -1;
indices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
}
}
void SkiaOutputSurfaceBase::ContextLost() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
for (auto& observer : observers_)
observer.OnContextLost();
}
} // namespace viz