mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
111 lines
3.5 KiB
C++
111 lines
3.5 KiB
C++
// Copyright 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_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
|
|
#define GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
|
|
|
|
#include <set>
|
|
|
|
#include "base/basictypes.h"
|
|
#include "base/callback.h"
|
|
#include "base/containers/hash_tables.h"
|
|
#include "base/memory/linked_ptr.h"
|
|
#include "base/memory/ref_counted.h"
|
|
#include "gpu/command_buffer/service/texture_manager.h"
|
|
#include "gpu/gpu_export.h"
|
|
|
|
namespace gfx {
|
|
class GLContext;
|
|
}
|
|
|
|
namespace gpu {
|
|
class AsyncPixelTransferDelegate;
|
|
class AsyncMemoryParams;
|
|
struct AsyncTexImage2DParams;
|
|
|
|
class AsyncPixelTransferCompletionObserver
|
|
: public base::RefCountedThreadSafe<AsyncPixelTransferCompletionObserver> {
|
|
public:
|
|
AsyncPixelTransferCompletionObserver();
|
|
|
|
virtual void DidComplete(const AsyncMemoryParams& mem_params) = 0;
|
|
|
|
protected:
|
|
virtual ~AsyncPixelTransferCompletionObserver();
|
|
|
|
private:
|
|
friend class base::RefCountedThreadSafe<AsyncPixelTransferCompletionObserver>;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferCompletionObserver);
|
|
};
|
|
|
|
class GPU_EXPORT AsyncPixelTransferManager
|
|
: public gles2::TextureManager::DestructionObserver {
|
|
public:
|
|
static AsyncPixelTransferManager* Create(gfx::GLContext* context);
|
|
|
|
~AsyncPixelTransferManager() override;
|
|
|
|
void Initialize(gles2::TextureManager* texture_manager);
|
|
|
|
virtual void BindCompletedAsyncTransfers() = 0;
|
|
|
|
// There's no guarantee that callback will run on the caller thread.
|
|
virtual void AsyncNotifyCompletion(
|
|
const AsyncMemoryParams& mem_params,
|
|
AsyncPixelTransferCompletionObserver* observer) = 0;
|
|
|
|
virtual uint32 GetTextureUploadCount() = 0;
|
|
virtual base::TimeDelta GetTotalTextureUploadTime() = 0;
|
|
|
|
// ProcessMorePendingTransfers() will be called at a good time
|
|
// to process a small amount of pending transfer work while
|
|
// NeedsProcessMorePendingTransfers() returns true. Implementations
|
|
// that can't dispatch work to separate threads should use
|
|
// this to avoid blocking the caller thread inappropriately.
|
|
virtual void ProcessMorePendingTransfers() = 0;
|
|
virtual bool NeedsProcessMorePendingTransfers() = 0;
|
|
|
|
// Wait for all AsyncTex(Sub)Image2D uploads to finish before returning.
|
|
virtual void WaitAllAsyncTexImage2D() = 0;
|
|
|
|
AsyncPixelTransferDelegate* CreatePixelTransferDelegate(
|
|
gles2::TextureRef* ref,
|
|
const AsyncTexImage2DParams& define_params);
|
|
|
|
AsyncPixelTransferDelegate* GetPixelTransferDelegate(
|
|
gles2::TextureRef* ref);
|
|
|
|
void ClearPixelTransferDelegateForTest(gles2::TextureRef* ref);
|
|
|
|
bool AsyncTransferIsInProgress(gles2::TextureRef* ref);
|
|
|
|
// gles2::TextureRef::DestructionObserver implementation:
|
|
void OnTextureManagerDestroying(gles2::TextureManager* manager) override;
|
|
void OnTextureRefDestroying(gles2::TextureRef* texture) override;
|
|
|
|
protected:
|
|
AsyncPixelTransferManager();
|
|
|
|
private:
|
|
gles2::TextureManager* manager_;
|
|
|
|
typedef base::hash_map<gles2::TextureRef*,
|
|
linked_ptr<AsyncPixelTransferDelegate> >
|
|
TextureToDelegateMap;
|
|
TextureToDelegateMap delegate_map_;
|
|
|
|
// A factory method called by CreatePixelTransferDelegate that is overriden
|
|
// by each implementation.
|
|
virtual AsyncPixelTransferDelegate* CreatePixelTransferDelegateImpl(
|
|
gles2::TextureRef* ref,
|
|
const AsyncTexImage2DParams& define_params) = 0;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferManager);
|
|
};
|
|
|
|
} // namespace gpu
|
|
|
|
#endif // GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
|