blob: 2f49e65069baac0bd9bcfb98d92a3cddc45bbff0 [file] [log] [blame]
// Copyright (c) 2013 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 GPU_IPC_SERVICE_STREAM_TEXTURE_ANDROID_H_
#define GPU_IPC_SERVICE_STREAM_TEXTURE_ANDROID_H_
#include <stdint.h>
#include <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/unguessable_token.h"
#include "gpu/command_buffer/service/shared_context_state.h"
#include "gpu/command_buffer/service/stream_texture_shared_image_interface.h"
#include "gpu/command_buffer/service/texture_owner.h"
#include "gpu/ipc/service/command_buffer_stub.h"
#include "ipc/ipc_listener.h"
#include "ui/gl/android/surface_texture.h"
#include "ui/gl/gl_image.h"
namespace gfx {
class Size;
}
namespace gpu {
class GpuChannel;
struct Mailbox;
class StreamTexture : public StreamTextureSharedImageInterface,
public IPC::Listener,
public SharedContextState::ContextLostObserver {
public:
static scoped_refptr<StreamTexture> Create(GpuChannel* channel,
int stream_id);
// Cleans up related data and nulls |channel_|. Called when the channel
// releases its ref on this class.
void ReleaseChannel();
private:
StreamTexture(GpuChannel* channel,
int32_t route_id,
scoped_refptr<SharedContextState> context_state);
~StreamTexture() override;
// Static function which is used to access |weak_stream_texture| on correct
// thread since WeakPtr is not thread safe.
static void RunCallback(
scoped_refptr<base::SingleThreadTaskRunner> task_runner,
base::WeakPtr<StreamTexture> weak_stream_texture);
// gl::GLImage implementation:
gfx::Size GetSize() override;
unsigned GetInternalFormat() override;
unsigned GetDataType() override;
BindOrCopy ShouldBindOrCopy() override;
bool BindTexImage(unsigned target) override;
void ReleaseTexImage(unsigned target) override;
bool CopyTexImage(unsigned target) override;
bool CopyTexSubImage(unsigned target,
const gfx::Point& offset,
const gfx::Rect& rect) override;
bool ScheduleOverlayPlane(gfx::AcceleratedWidget widget,
int z_order,
gfx::OverlayTransform transform,
const gfx::Rect& bounds_rect,
const gfx::RectF& crop_rect,
bool enable_blend,
std::unique_ptr<gfx::GpuFence> gpu_fence) override;
void SetColorSpace(const gfx::ColorSpace& color_space) override {}
void Flush() override {}
void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
uint64_t process_tracing_id,
const std::string& dump_name) override;
bool HasMutableState() const override;
std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
GetAHardwareBuffer() override;
// gpu::StreamTextureSharedImageInterface implementation.
void ReleaseResources() override {}
bool IsUsingGpuMemory() const override;
void UpdateAndBindTexImage(GLuint service_id) override;
bool HasTextureOwner() const override;
TextureBase* GetTextureBase() const override;
void NotifyOverlayPromotion(bool promotion, const gfx::Rect& bounds) override;
bool RenderToOverlay() override;
bool TextureOwnerBindsTextureOnUpdate() override;
// SharedContextState::ContextLostObserver implementation.
void OnContextLost() override;
// Update the TextureOwner to get the latest image. Also bind the latest image
// to the provided |service_id| if TextureOwner does not binds texture on
// update. If |bindings_mode| is other than kEnsureTexImageBound, then
// |service_id| is not required.
void UpdateTexImage(BindingsMode bindings_mode, GLuint service_id);
// Ensure that the latest image is bound to the texture |service_id| if
// TextureOwner does not binds texture on update. If TextureOwner binds
// texture on update, then it will always be bound to the TextureOwners
// texture and |service_id| will be ignored.
void EnsureBoundIfNeeded(BindingsMode mode, GLuint service_id);
gpu::Mailbox CreateSharedImage(const gfx::Size& coded_size);
// Called when a new frame is available for the SurfaceOwner.
void OnFrameAvailable();
// IPC::Listener implementation:
bool OnMessageReceived(const IPC::Message& message) override;
// IPC message handlers:
void OnStartListening();
void OnForwardForSurfaceRequest(const base::UnguessableToken& request_token);
void OnUpdateRotatedVisibleSize(const gfx::Size& natural_size);
// The TextureOwner which receives frames.
scoped_refptr<TextureOwner> texture_owner_;
// Current visible size from media player, includes rotation.
gfx::Size rotated_visible_size_;
// Whether a new frame is available that we should update to.
bool has_pending_frame_;
GpuChannel* channel_;
int32_t route_id_;
bool has_listener_;
scoped_refptr<SharedContextState> context_state_;
SequenceId sequence_;
scoped_refptr<gpu::SyncPointClientState> sync_point_client_state_;
gfx::Size coded_size_;
gfx::Rect visible_rect_;
base::WeakPtrFactory<StreamTexture> weak_factory_{this};
DISALLOW_COPY_AND_ASSIGN(StreamTexture);
};
} // namespace gpu
#endif // GPU_IPC_SERVICE_STREAM_TEXTURE_ANDROID_H_