blob: cf893ca82453e8098238a04d872c8597ec9af5a7 [file] [log] [blame]
// Copyright 2012 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.
#ifndef COMPONENTS_VIZ_COMMON_RESOURCES_TRANSFERABLE_RESOURCE_H_
#define COMPONENTS_VIZ_COMMON_RESOURCES_TRANSFERABLE_RESOURCE_H_
#include <stdint.h>
#include <vector>
#include "build/build_config.h"
#include "components/viz/common/resources/resource_format.h"
#include "components/viz/common/resources/resource_id.h"
#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"
namespace viz {
struct ReturnedResource;
struct VIZ_COMMON_EXPORT TransferableResource {
TransferableResource();
~TransferableResource();
TransferableResource(const TransferableResource& other);
TransferableResource& operator=(const TransferableResource& other);
ReturnedResource ToReturnedResource() const;
static std::vector<ReturnedResource> ReturnResources(
const std::vector<TransferableResource>& input);
static TransferableResource MakeSoftware(const SharedBitmapId& id,
const gfx::Size& size,
ResourceFormat format) {
TransferableResource r;
r.is_software = true;
r.mailbox_holder.mailbox = id;
r.size = size;
r.format = format;
return r;
}
static TransferableResource MakeGL(const gpu::Mailbox& mailbox,
uint32_t filter,
uint32_t texture_target,
const gpu::SyncToken& sync_token,
const gfx::Size& size,
bool is_overlay_candidate) {
TransferableResource r;
r.is_software = false;
r.filter = filter;
r.mailbox_holder.mailbox = mailbox;
r.mailbox_holder.texture_target = texture_target;
r.mailbox_holder.sync_token = sync_token;
r.size = size;
r.is_overlay_candidate = is_overlay_candidate;
return r;
}
// TODO(danakj): Some of these fields are only GL, some are only Software,
// some are both but used for different purposes (like the mailbox name).
// It would be nice to group things together and make it more clear when
// they will be used or not, and provide easier access to fields such as the
// mailbox that also show the intent for software for GL.
// An |id| field that can be unique to this resource. For resources
// generated by compositor clients, this |id| may be used for their
// own book-keeping but need not be set at all.
ResourceId id = kInvalidResourceId;
// Indicates if the resource is gpu or software backed. If gpu, the
// mailbox field is a gpu::Mailbox, else it is a SharedBitmapId.
bool is_software = false;
// The number of pixels in the gpu mailbox/software bitmap.
gfx::Size size;
// The format of the pixels in the gpu mailbox/software bitmap. This should
// almost always be RGBA_8888 for resources generated by compositor clients,
// and must be RGBA_8888 always for software resources.
ResourceFormat format = RGBA_8888;
// The |mailbox| inside here holds the gpu::Mailbox when this is a gpu
// resource, or the SharedBitmapId when it is a software resource.
// The |texture_target| and sync_token| inside here only apply for gpu
// resources.
gpu::MailboxHolder mailbox_holder;
// The color space of the pixels in the resource.
gfx::ColorSpace color_space;
// A gpu resource may be possible to use directly in an overlay if this is
// true.
bool is_overlay_candidate = false;
// For a gpu resource, the filter to use when scaling the resource when
// drawing it. Typically GL_LINEAR, or GL_NEAREST if no anti-aliasing
// during scaling is desired.
uint32_t filter = 0;
// If a gpu resource is backed by a GpuMemoryBuffer, then it will be accessed
// 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.
absl::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
// |is_overlay_candidate|, to find out if switching the resource to a
// a SurfaceView would result in overlay promotion. It's good to find this
// out in advance, since one has no fallback path for displaying a
// SurfaceView except via promoting it to an overlay. Ideally, one _could_
// promote SurfaceTexture via the overlay path, even if one ended up just
// drawing a quad in the compositor. However, for now, we use this flag to
// refuse to promote so that the compositor will draw the quad.
bool is_backed_by_surface_texture = false;
// Indicates that this resource would like a promotion hint.
bool wants_promotion_hint = false;
#endif
bool operator==(const TransferableResource& o) const {
return id == o.id && is_software == o.is_software && size == o.size &&
format == o.format &&
mailbox_holder.mailbox == o.mailbox_holder.mailbox &&
mailbox_holder.sync_token == o.mailbox_holder.sync_token &&
mailbox_holder.texture_target == o.mailbox_holder.texture_target &&
color_space == o.color_space &&
is_overlay_candidate == o.is_overlay_candidate &&
filter == o.filter &&
#if defined(OS_ANDROID)
is_backed_by_surface_texture == o.is_backed_by_surface_texture &&
wants_promotion_hint == o.wants_promotion_hint &&
#endif
read_lock_fences_enabled == o.read_lock_fences_enabled;
}
bool operator!=(const TransferableResource& o) const { return !(*this == o); }
};
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_RESOURCES_TRANSFERABLE_RESOURCE_H_