1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
#define GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/trace_event/memory_dump_provider.h"
#include "gpu/command_buffer/client/client_transfer_cache.h"
#include "gpu/command_buffer/client/context_support.h"
#include "gpu/command_buffer/client/gles2_impl_export.h"
#include "gpu/command_buffer/client/gpu_control_client.h"
#include "gpu/command_buffer/client/query_tracker.h"
#include "gpu/command_buffer/client/transfer_buffer.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "gpu/command_buffer/common/context_result.h"
class GrDirectContext;
namespace gpu {
namespace gles2 {
class QueryTracker;
}
class CommandBufferHelper;
class GpuControl;
class MappedMemoryManager;
struct SharedMemoryLimits;
// Base class with functionality shared between GLES2Implementation and
// RasterImplementation.
class GLES2_IMPL_EXPORT ImplementationBase
: public base::trace_event::MemoryDumpProvider,
public ContextSupport,
public GpuControlClient {
public:
// The maximum result size from simple GL get commands.
static const uint32_t kMaxSizeOfSimpleResult =
16 * sizeof(uint32_t); // NOLINT.
// used for testing only. If more things are reseved add them here.
static const uint32_t kStartingOffset = kMaxSizeOfSimpleResult;
// Alignment of allocations.
static const unsigned int kAlignment = 16;
// The bucket used for results. Public for testing only.
static const uint32_t kResultBucketId = 1;
ImplementationBase(CommandBufferHelper* helper,
TransferBufferInterface* transfer_buffer,
GpuControl* gpu_control);
ImplementationBase(const ImplementationBase&) = delete;
ImplementationBase& operator=(const ImplementationBase&) = delete;
~ImplementationBase() override;
void FreeUnusedSharedMemory();
void FreeEverything();
// TODO(danakj): Move to ContextSupport once ContextProvider doesn't need to
// intercept it.
void SetLostContextCallback(base::OnceClosure callback);
const Capabilities& capabilities() const { return capabilities_; }
// ContextSupport implementation.
void FlushPendingWork() override;
void SignalSyncToken(const gpu::SyncToken& sync_token,
base::OnceClosure callback) override;
bool IsSyncTokenSignaled(const gpu::SyncToken& sync_token) override;
void SignalQuery(uint32_t query, base::OnceClosure callback) override;
void GetGpuFence(uint32_t gpu_fence_id,
base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)>
callback) override;
void SetGrContext(GrDirectContext* gr) override;
bool HasGrContextSupport() const override;
void WillCallGLFromSkia() override;
void DidCallGLFromSkia() override;
// base::trace_event::MemoryDumpProvider implementation.
bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* pmd) override;
// Used by child classes to implement gpu::InterfaceBase
void GenSyncToken(GLbyte* sync_token);
void GenUnverifiedSyncToken(GLbyte* sync_token);
void VerifySyncTokens(GLbyte** sync_tokens, GLsizei count);
void WaitSyncToken(const GLbyte* sync_token);
protected:
gpu::ContextResult Initialize(const SharedMemoryLimits& limits);
// Waits for all commands to execute.
bool WaitForCmd();
// Gets the value of the result.
template <typename T>
ScopedResultPtr<T> GetResultAs() {
return ScopedResultPtr<T>(transfer_buffer_);
}
int32_t GetResultShmId();
// TODO(gman): These bucket functions really seem like they belong in
// CommandBufferHelper (or maybe BucketHelper?). Unfortunately they need
// a transfer buffer to function which is currently managed by this class.
// Gets the contents of a bucket.
bool GetBucketContents(uint32_t bucket_id, std::vector<int8_t>* data);
// Sets the contents of a bucket.
void SetBucketContents(uint32_t bucket_id, const void* data, uint32_t size);
// Sets the contents of a bucket as a string.
void SetBucketAsCString(uint32_t bucket_id, const char* str);
// Gets the contents of a bucket as a string. Returns false if there is no
// string available which is a separate case from the empty string.
bool GetBucketAsString(uint32_t bucket_id, std::string* str);
// Sets the contents of a bucket as a string.
void SetBucketAsString(uint32_t bucket_id, const std::string& str);
bool GetVerifiedSyncTokenForIPC(const SyncToken& sync_token,
SyncToken* verified_sync_token);
void RunIfContextNotLost(base::OnceClosure callback);
raw_ptr<TransferBufferInterface> transfer_buffer_;
std::unique_ptr<MappedMemoryManager> mapped_memory_;
std::unique_ptr<gles2::QueryTracker> query_tracker_;
base::OnceClosure lost_context_callback_;
bool lost_context_callback_run_ = false;
const raw_ptr<GpuControl> gpu_control_;
Capabilities capabilities_;
private:
virtual void IssueShallowFlush() = 0;
virtual void SetGLError(GLenum error,
const char* function_name,
const char* msg) = 0;
raw_ptr<CommandBufferHelper> helper_;
base::WeakPtrFactory<ImplementationBase> weak_ptr_factory_{this};
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_CLIENT_IMPLEMENTATION_BASE_H_
|