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
|
// 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.
#include "gpu/command_buffer/service/gpu_control_service.h"
#include "gpu/command_buffer/client/gpu_memory_buffer_factory.h"
#include "gpu/command_buffer/service/gpu_memory_buffer_manager.h"
#include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/command_buffer/service/query_manager.h"
namespace gpu {
GpuControlService::GpuControlService(
GpuMemoryBufferManagerInterface* gpu_memory_buffer_manager,
GpuMemoryBufferFactory* gpu_memory_buffer_factory,
gles2::MailboxManager* mailbox_manager,
gles2::QueryManager* query_manager)
: gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
gpu_memory_buffer_factory_(gpu_memory_buffer_factory),
mailbox_manager_(mailbox_manager),
query_manager_(query_manager) {
}
GpuControlService::~GpuControlService() {
}
bool GpuControlService::SupportsGpuMemoryBuffer() {
return gpu_memory_buffer_manager_ && gpu_memory_buffer_factory_;
}
gfx::GpuMemoryBuffer* GpuControlService::CreateGpuMemoryBuffer(
size_t width,
size_t height,
unsigned internalformat,
int32* id) {
*id = -1;
CHECK(gpu_memory_buffer_factory_) << "No GPU memory buffer factory provided";
linked_ptr<gfx::GpuMemoryBuffer> buffer = make_linked_ptr(
gpu_memory_buffer_factory_->CreateGpuMemoryBuffer(width,
height,
internalformat));
if (!buffer.get())
return NULL;
static int32 next_id = 1;
*id = next_id++;
if (!RegisterGpuMemoryBuffer(*id,
buffer->GetHandle(),
width,
height,
internalformat)) {
*id = -1;
return NULL;
}
gpu_memory_buffers_[*id] = buffer;
return buffer.get();
}
void GpuControlService::DestroyGpuMemoryBuffer(int32 id) {
GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id);
if (it != gpu_memory_buffers_.end())
gpu_memory_buffers_.erase(it);
gpu_memory_buffer_manager_->DestroyGpuMemoryBuffer(id);
}
uint32 GpuControlService::InsertSyncPoint() {
NOTREACHED();
return 0u;
}
void GpuControlService::SignalSyncPoint(uint32 sync_point,
const base::Closure& callback) {
NOTREACHED();
}
void GpuControlService::SignalQuery(uint32 query_id,
const base::Closure& callback) {
DCHECK(query_manager_);
gles2::QueryManager::Query* query = query_manager_->GetQuery(query_id);
if (!query)
callback.Run();
else
query->AddCallback(callback);
}
void GpuControlService::SendManagedMemoryStats(
const ManagedMemoryStats& stats) {
NOTREACHED();
}
bool GpuControlService::RegisterGpuMemoryBuffer(
int32 id,
gfx::GpuMemoryBufferHandle buffer,
size_t width,
size_t height,
unsigned internalformat) {
return gpu_memory_buffer_manager_->RegisterGpuMemoryBuffer(id,
buffer,
width,
height,
internalformat);
}
bool GpuControlService::GenerateMailboxNames(
unsigned num, std::vector<gpu::Mailbox>* names) {
DCHECK(names->empty());
names->resize(num);
for (unsigned i = 0; i < num; ++i) {
gles2::MailboxName name;
mailbox_manager_->GenerateMailboxName(&name);
(*names)[i].SetName(name.key);
}
return true;
}
} // namespace gpu
|