blob: 82bef3a0c62b6f8f8ebc17bae94f480080effe66 [file] [log] [blame]
// Copyright 2017 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_RESOURCE_H_
#define COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_H_
#include <memory>
#include "build/build_config.h"
#include "components/viz/common/quads/shared_bitmap.h"
#include "components/viz/common/resources/release_callback.h"
#include "components/viz/common/resources/resource_fence.h"
#include "components/viz/common/resources/resource_format.h"
#include "components/viz/common/resources/resource_id.h"
#include "components/viz/common/resources/resource_texture_hint.h"
#include "components/viz/common/resources/resource_type.h"
#include "components/viz/common/viz_common_export.h"
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "third_party/khronos/GLES2/gl2.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
namespace gfx {
class GpuMemoryBuffer;
}
namespace viz {
namespace internal {
// The data structure used to track state of Gpu and Software-based
// resources both in the client and the service, for resources transferred
// between the two. This is an implementation detail of the resource tracking
// for client and service libraries and should not be used directly from
// external client code.
struct VIZ_COMMON_EXPORT Resource {
enum Origin { INTERNAL, DELEGATED };
enum SynchronizationState {
// The LOCALLY_USED state is the state each resource defaults to when
// constructed or modified or read. This state indicates that the
// resource has not been properly synchronized and it would be an error
// to send this resource to a parent, child, or client.
LOCALLY_USED,
// The NEEDS_WAIT state is the state that indicates a resource has been
// modified but it also has an associated sync token assigned to it.
// The sync token has not been waited on with the local context. When
// a sync token arrives from an external resource (such as a child or
// parent), it is automatically initialized as NEEDS_WAIT as well
// since we still need to wait on it before the resource is synchronized
// on the current context. It is an error to use the resource locally for
// reading or writing if the resource is in this state.
NEEDS_WAIT,
// The SYNCHRONIZED state indicates that the resource has been properly
// synchronized locally. This can either synchronized externally (such
// as the case of software rasterized bitmaps), or synchronized
// internally using a sync token that has been waited upon. In the
// former case where the resource was synchronized externally, a
// corresponding sync token will not exist. In the latter case which was
// synchronized from the NEEDS_WAIT state, a corresponding sync token will
// exist which is associated with the resource. This sync token is still
// valid and still associated with the resource and can be passed as an
// external resource for others to wait on.
SYNCHRONIZED,
};
enum MipmapState { INVALID, GENERATE, VALID };
Resource(const gfx::Size& size,
Origin origin,
ResourceTextureHint hint,
ResourceType type,
ResourceFormat format,
const gfx::ColorSpace& color_space);
Resource(Resource&& other);
~Resource();
Resource& operator=(Resource&& other);
bool is_gpu_resource_type() const { return type != ResourceType::kBitmap; }
bool needs_sync_token() const {
return type != ResourceType::kBitmap &&
synchronization_state_ == LOCALLY_USED;
}
const gpu::SyncToken& sync_token() const { return sync_token_; }
SynchronizationState synchronization_state() const {
return synchronization_state_;
}
void SetSharedBitmap(SharedBitmap* bitmap);
void SetLocallyUsed();
void SetSynchronized();
void UpdateSyncToken(const gpu::SyncToken& sync_token);
// If true the texture-backed or GpuMemoryBuffer-backed resource needs its
// SyncToken waited on in order to be synchronized for use.
bool ShouldWaitSyncToken() const;
int8_t* GetSyncTokenData();
void SetGenerateMipmap();
// Bitfield flags. ======
// When true, the resource is currently being written to. Used to prevent
// misuse while the resource is being modified.
bool locked_for_write : 1;
// When true, the resource is currently being used externally.
bool locked_for_external_use : 1;
// When true the resource can not be used and must only be deleted. This is
// passed along to the |release_callback|.
bool lost : 1;
// When the resource should be deleted until it is actually reaped.
bool marked_for_deletion : 1;
// When false, the resource backing hasn't been allocated yet.
bool allocated : 1;
// Tracks if a gpu fence needs to be used for reading a GpuMemoryBuffer-
// backed or texture-backed resource.
bool read_lock_fences_enabled : 1;
// True if the software-backed resource is in shared memory, in which case
// |shared_bitmap_id| will be valid.
bool has_shared_bitmap_id : 1;
// When true, the resource should be considered for being displayed in an
// overlay.
bool is_overlay_candidate : 1;
#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 : 1;
// Indicates that this resource would like a promotion hint.
bool wants_promotion_hint : 1;
#endif
// In the service, this is the id of the client the resource comes from.
int child_id = 0;
// In the service, this is the id of the resource in the client's namespace.
ResourceId id_in_child = 0;
// Texture id for texture-backed resources.
GLuint gl_id = 0;
// The mailbox associated with resources received from the client to the
// service. The mailbox has the IPC-capable data for sharing the resource
// backing between modules/GL contexts/processes.
gpu::Mailbox mailbox;
// Non-owning pointer to a software-backed resource when mapped.
uint8_t* pixels = nullptr;
// Reference-counts to know when a resource can be released through the
// |release_callback| after it is deleted, and for verifying correct use
// of the resource.
int lock_for_read_count = 0;
int imported_count = 0;
int exported_count = 0;
// A fence used for accessing a GpuMemoryBuffer-backed or texture-backed
// resource for reading, that ensures any writing done to the resource has
// been completed. This is implemented and used to implement transferring
// ownership of the resource from the client to the service, and in the GL
// drawing code before reading from the texture.
scoped_refptr<ResourceFence> read_lock_fence;
// Size of the resource in pixels.
gfx::Size size;
// Where the resource was originally allocated. Either internally by the
// ResourceProvider instance, or in a client and given to the ResourceProvider
// via IPC.
Origin origin = INTERNAL;
// The texture target for GpuMemoryBuffer- and texture-backed resources.
GLenum target = GL_TEXTURE_2D;
// The min/mag filter of the resource when it was given to/created by the
// ResourceProvider, for texture-backed resources. Used to restore
// the filter before releasing the resource. Not used for GpuMemoryBuffer-
// backed resources as they are always internally created, so not released.
// TODO(skyostil): Use a separate sampler object for filter state.
GLenum original_filter = GL_LINEAR;
// The current mag filter for GpuMemoryBuffer- and texture-backed resources.
GLenum filter = GL_LINEAR;
// The current min filter for GpuMemoryBuffer- and texture-backed resources.
GLenum min_filter = GL_LINEAR;
// The GL image id for GpuMemoryBuffer-backed resources.
GLuint image_id = 0;
// A hint for texture-backed resources about how the resource will be used,
// that dictates how it should be allocated/used.
ResourceTextureHint hint = ResourceTextureHint::kDefault;
// The type of backing for the resource (such as gpu vs software).
ResourceType type = ResourceType::kBitmap;
// GpuMemoryBuffer resource allocation needs to know how the resource will
// be used.
gfx::BufferUsage usage = gfx::BufferUsage::GPU_READ_CPU_READ_WRITE;
// This is the the actual format of the underlying GpuMemoryBuffer, if any,
// and might not correspond to ResourceFormat. This format is needed to
// allocate the GpuMemoryBuffer and scanout the buffer as a hardware overlay.
gfx::BufferFormat buffer_format = gfx::BufferFormat::RGBA_8888;
// The format as seen from the compositor and might not correspond to
// buffer_format (e.g: A resouce that was created from a YUV buffer could be
// seen as RGB from the compositor/GL). This is used to derive the GL texture
// format for texture-backed resources, the image format for GpuMemoryBuffer-
// backed resources, or the SkColorType used for software-backed resources.
ResourceFormat format = ResourceFormat::RGBA_8888;
// The name of the shared memory for software-backed resources, but not
// present if the resource isn't shared memory.
SharedBitmapId shared_bitmap_id;
// A pointer to the shared memory structure for software-backed resources, but
// not present if the resources isn't shared memory.
SharedBitmap* shared_bitmap = nullptr;
// Ownership of |shared_bitmap| for when it is created internally.
std::unique_ptr<SharedBitmap> owned_shared_bitmap;
// The GpuMemoryBuffer ownership for GpuMemoryBuffer-backed resources.
std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
// The color space for all resource types, to control how the resource should
// be drawn to output device.
gfx::ColorSpace color_space;
// Used to track generating mipmaps for texture-backed resources.
MipmapState mipmap_state = INVALID;
private:
// Tracks if a sync token needs to be waited on before using the resource.
SynchronizationState synchronization_state_ = SYNCHRONIZED;
// A SyncToken associated with a texture-backed or GpuMemoryBuffer-backed
// resource. It is given from a child to the service, and waited on in order
// to use the resource, and this is tracked by the |synchronization_state_|.
gpu::SyncToken sync_token_;
DISALLOW_COPY_AND_ASSIGN(Resource);
};
} // namespace internal
} // namespace viz
#endif // COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_H_