OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2009, Google Inc. | 2 * Copyright 2009, Google Inc. |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 has_data_(false), | 49 has_data_(false), |
50 resource_id_(command_buffer::kInvalidResource), | 50 resource_id_(command_buffer::kInvalidResource), |
51 renderer_(renderer) { | 51 renderer_(renderer) { |
52 } | 52 } |
53 | 53 |
54 | 54 |
55 VertexBufferCB::~VertexBufferCB() { | 55 VertexBufferCB::~VertexBufferCB() { |
56 ConcreteFree(); | 56 ConcreteFree(); |
57 } | 57 } |
58 | 58 |
59 // Sends the DESTROY_VERTEX_BUFFER command, and frees the ID from the allocator. | 59 // Sends the DestroyVertexBuffer command, and frees the ID from the allocator. |
60 void VertexBufferCB::ConcreteFree() { | 60 void VertexBufferCB::ConcreteFree() { |
61 if (resource_id_ != command_buffer::kInvalidResource) { | 61 if (resource_id_ != command_buffer::kInvalidResource) { |
62 CommandBufferHelper *helper = renderer_->helper(); | 62 CommandBufferHelper *helper = renderer_->helper(); |
63 CommandBufferEntry args[1]; | 63 helper->DestroyVertexBuffer(resource_id_); |
64 args[0].value_uint32 = resource_id_; | |
65 helper->AddCommand(command_buffer::DESTROY_VERTEX_BUFFER, 1, args); | |
66 renderer_->vertex_buffer_ids().FreeID(resource_id_); | 64 renderer_->vertex_buffer_ids().FreeID(resource_id_); |
67 resource_id_ = command_buffer::kInvalidResource; | 65 resource_id_ = command_buffer::kInvalidResource; |
68 } | 66 } |
69 } | 67 } |
70 | 68 |
71 // Allocates a resource ID, and sends the CREATE_VERTEX_BUFFER command. | 69 // Allocates a resource ID, and sends the CreateVertexBuffer command. |
72 bool VertexBufferCB::ConcreteAllocate(size_t size_in_bytes) { | 70 bool VertexBufferCB::ConcreteAllocate(size_t size_in_bytes) { |
73 ConcreteFree(); | 71 ConcreteFree(); |
74 if (size_in_bytes > 0) { | 72 if (size_in_bytes > 0) { |
75 resource_id_ = renderer_->vertex_buffer_ids().AllocateID(); | 73 resource_id_ = renderer_->vertex_buffer_ids().AllocateID(); |
76 CommandBufferHelper *helper = renderer_->helper(); | 74 CommandBufferHelper *helper = renderer_->helper(); |
77 CommandBufferEntry args[3]; | 75 helper->CreateVertexBuffer(resource_id_, size_in_bytes, 0); |
78 args[0].value_uint32 = resource_id_; | |
79 args[1].value_uint32 = size_in_bytes; | |
80 args[2].value_uint32 = 0; // no flags. | |
81 helper->AddCommand(command_buffer::CREATE_VERTEX_BUFFER, 3, args); | |
82 has_data_ = false; | 76 has_data_ = false; |
83 } | 77 } |
84 return true; | 78 return true; |
85 } | 79 } |
86 | 80 |
87 // Allocates the locked region into the transfer shared memory area. If the | 81 // Allocates the locked region into the transfer shared memory area. If the |
88 // buffer resource contains data, copies it back (by sending the | 82 // buffer resource contains data, copies it back (by sending the |
89 // GET_VERTEX_BUFFER_DATA command). | 83 // GetVertexBufferData command). |
90 bool VertexBufferCB::ConcreteLock(AccessMode access_mode, void **buffer_data) { | 84 bool VertexBufferCB::ConcreteLock(AccessMode access_mode, void **buffer_data) { |
91 *buffer_data = NULL; | 85 *buffer_data = NULL; |
92 if (GetSizeInBytes() == 0 || lock_pointer_) | 86 if (GetSizeInBytes() == 0 || lock_pointer_) |
93 return false; | 87 return false; |
94 lock_pointer_ = renderer_->allocator()->Alloc(GetSizeInBytes()); | 88 lock_pointer_ = renderer_->allocator()->Alloc(GetSizeInBytes()); |
95 if (!lock_pointer_) return false; | 89 if (!lock_pointer_) return false; |
96 if (has_data_) { | 90 if (has_data_) { |
97 CommandBufferHelper *helper = renderer_->helper(); | 91 CommandBufferHelper *helper = renderer_->helper(); |
98 CommandBufferEntry args[5]; | 92 helper->GetVertexBufferData( |
99 args[0].value_uint32 = resource_id_; | 93 resource_id_, 0, GetSizeInBytes(), |
100 args[1].value_uint32 = 0; | 94 renderer_->transfer_shm_id(), |
101 args[2].value_uint32 = GetSizeInBytes(); | 95 renderer_->allocator()->GetOffset(lock_pointer_)); |
102 args[3].value_uint32 = renderer_->transfer_shm_id(); | |
103 args[4].value_uint32 = renderer_->allocator()->GetOffset(lock_pointer_); | |
104 helper->AddCommand(command_buffer::GET_VERTEX_BUFFER_DATA, 5, args); | |
105 helper->Finish(); | 96 helper->Finish(); |
106 } | 97 } |
107 *buffer_data = lock_pointer_; | 98 *buffer_data = lock_pointer_; |
108 return true; | 99 return true; |
109 } | 100 } |
110 | 101 |
111 // Copies the data into the resource by sending the SET_VERTEX_BUFFER_DATA | 102 // Copies the data into the resource by sending the SetVertexBufferData |
112 // command, then frees the shared memory, pending the transfer completion. | 103 // command, then frees the shared memory, pending the transfer completion. |
113 bool VertexBufferCB::ConcreteUnlock() { | 104 bool VertexBufferCB::ConcreteUnlock() { |
114 if (GetSizeInBytes() == 0 || !lock_pointer_) | 105 if (GetSizeInBytes() == 0 || !lock_pointer_) |
115 return false; | 106 return false; |
116 CommandBufferHelper *helper = renderer_->helper(); | 107 CommandBufferHelper *helper = renderer_->helper(); |
117 CommandBufferEntry args[5]; | 108 helper->SetVertexBufferData( |
118 args[0].value_uint32 = resource_id_; | 109 resource_id_, 0, GetSizeInBytes(), |
119 args[1].value_uint32 = 0; | 110 renderer_->transfer_shm_id(), |
120 args[2].value_uint32 = GetSizeInBytes(); | 111 renderer_->allocator()->GetOffset(lock_pointer_)); |
121 args[3].value_uint32 = renderer_->transfer_shm_id(); | 112 |
122 args[4].value_uint32 = renderer_->allocator()->GetOffset(lock_pointer_); | |
123 helper->AddCommand(command_buffer::SET_VERTEX_BUFFER_DATA, 5, args); | |
124 renderer_->allocator()->FreePendingToken(lock_pointer_, | 113 renderer_->allocator()->FreePendingToken(lock_pointer_, |
125 helper->InsertToken()); | 114 helper->InsertToken()); |
126 lock_pointer_ = NULL; | 115 lock_pointer_ = NULL; |
127 has_data_ = true; | 116 has_data_ = true; |
128 return true; | 117 return true; |
129 } | 118 } |
130 | 119 |
131 IndexBufferCB::IndexBufferCB(ServiceLocator* service_locator, | 120 IndexBufferCB::IndexBufferCB(ServiceLocator* service_locator, |
132 RendererCB *renderer) | 121 RendererCB *renderer) |
133 : IndexBuffer(service_locator), | 122 : IndexBuffer(service_locator), |
134 lock_pointer_(NULL), | 123 lock_pointer_(NULL), |
135 has_data_(false), | 124 has_data_(false), |
136 resource_id_(command_buffer::kInvalidResource), | 125 resource_id_(command_buffer::kInvalidResource), |
137 renderer_(renderer) { | 126 renderer_(renderer) { |
138 } | 127 } |
139 | 128 |
140 | 129 |
141 IndexBufferCB::~IndexBufferCB() { | 130 IndexBufferCB::~IndexBufferCB() { |
142 ConcreteFree(); | 131 ConcreteFree(); |
143 } | 132 } |
144 | 133 |
145 // Sends the DESTROY_INDEX_BUFFER command, and frees the ID from the allocator. | 134 // Sends the DestroyIndexBuffer command, and frees the ID from the allocator. |
146 void IndexBufferCB::ConcreteFree() { | 135 void IndexBufferCB::ConcreteFree() { |
147 if (resource_id_ != command_buffer::kInvalidResource) { | 136 if (resource_id_ != command_buffer::kInvalidResource) { |
148 CommandBufferHelper *helper = renderer_->helper(); | 137 CommandBufferHelper *helper = renderer_->helper(); |
149 CommandBufferEntry args[1]; | 138 helper->DestroyIndexBuffer(resource_id_); |
150 args[0].value_uint32 = resource_id_; | |
151 helper->AddCommand(command_buffer::DESTROY_INDEX_BUFFER, 1, args); | |
152 renderer_->index_buffer_ids().FreeID(resource_id_); | 139 renderer_->index_buffer_ids().FreeID(resource_id_); |
153 resource_id_ = command_buffer::kInvalidResource; | 140 resource_id_ = command_buffer::kInvalidResource; |
154 } | 141 } |
155 } | 142 } |
156 | 143 |
157 // Allocates a resource ID, and sends the CREATE_INDEX_BUFFER command. | 144 // Allocates a resource ID, and sends the CreateIndexBuffer command. |
158 bool IndexBufferCB::ConcreteAllocate(size_t size_in_bytes) { | 145 bool IndexBufferCB::ConcreteAllocate(size_t size_in_bytes) { |
159 ConcreteFree(); | 146 ConcreteFree(); |
160 if (size_in_bytes > 0) { | 147 if (size_in_bytes > 0) { |
161 resource_id_ = renderer_->index_buffer_ids().AllocateID(); | 148 resource_id_ = renderer_->index_buffer_ids().AllocateID(); |
162 CommandBufferHelper *helper = renderer_->helper(); | 149 CommandBufferHelper *helper = renderer_->helper(); |
163 CommandBufferEntry args[3]; | 150 helper->CreateIndexBuffer( |
164 args[0].value_uint32 = resource_id_; | 151 resource_id_, size_in_bytes, |
165 args[1].value_uint32 = size_in_bytes; | 152 command_buffer::index_buffer::INDEX_32BIT); |
166 args[2].value_uint32 = command_buffer::index_buffer::INDEX_32BIT; | |
167 helper->AddCommand(command_buffer::CREATE_INDEX_BUFFER, 3, args); | |
168 has_data_ = false; | 153 has_data_ = false; |
169 } | 154 } |
170 return true; | 155 return true; |
171 } | 156 } |
172 | 157 |
173 // Allocates the locked region into the transfer shared memory area. If the | 158 // Allocates the locked region into the transfer shared memory area. If the |
174 // buffer resource contains data, copies it back (by sending the | 159 // buffer resource contains data, copies it back (by sending the |
175 // GET_INDEX_BUFFER_DATA command). | 160 // GetIndexBufferData command). |
176 bool IndexBufferCB::ConcreteLock(AccessMode access_mode, void **buffer_data) { | 161 bool IndexBufferCB::ConcreteLock(AccessMode access_mode, void **buffer_data) { |
177 *buffer_data = NULL; | 162 *buffer_data = NULL; |
178 if (GetSizeInBytes() == 0 || lock_pointer_) | 163 if (GetSizeInBytes() == 0 || lock_pointer_) |
179 return false; | 164 return false; |
180 lock_pointer_ = renderer_->allocator()->Alloc(GetSizeInBytes()); | 165 lock_pointer_ = renderer_->allocator()->Alloc(GetSizeInBytes()); |
181 if (!lock_pointer_) return false; | 166 if (!lock_pointer_) return false; |
182 if (has_data_) { | 167 if (has_data_) { |
183 CommandBufferHelper *helper = renderer_->helper(); | 168 CommandBufferHelper *helper = renderer_->helper(); |
184 CommandBufferEntry args[5]; | 169 helper->GetIndexBufferData( |
185 args[0].value_uint32 = resource_id_; | 170 resource_id_, 0, GetSizeInBytes(), |
186 args[1].value_uint32 = 0; | 171 renderer_->transfer_shm_id(), |
187 args[2].value_uint32 = GetSizeInBytes(); | 172 renderer_->allocator()->GetOffset(lock_pointer_)); |
188 args[3].value_uint32 = renderer_->transfer_shm_id(); | |
189 args[4].value_uint32 = renderer_->allocator()->GetOffset(lock_pointer_); | |
190 helper->AddCommand(command_buffer::GET_INDEX_BUFFER_DATA, 5, args); | |
191 helper->Finish(); | 173 helper->Finish(); |
192 } | 174 } |
193 *buffer_data = lock_pointer_; | 175 *buffer_data = lock_pointer_; |
194 return true; | 176 return true; |
195 } | 177 } |
196 | 178 |
197 // Copies the data into the resource by sending the SET_INDEX_BUFFER_DATA | 179 // Copies the data into the resource by sending the SetIndexBufferData |
198 // command, then frees the shared memory, pending the transfer completion. | 180 // command, then frees the shared memory, pending the transfer completion. |
199 bool IndexBufferCB::ConcreteUnlock() { | 181 bool IndexBufferCB::ConcreteUnlock() { |
200 if (GetSizeInBytes() == 0 || !lock_pointer_) | 182 if (GetSizeInBytes() == 0 || !lock_pointer_) |
201 return false; | 183 return false; |
202 CommandBufferHelper *helper = renderer_->helper(); | 184 CommandBufferHelper *helper = renderer_->helper(); |
203 CommandBufferEntry args[5]; | 185 helper->SetIndexBufferData( |
204 args[0].value_uint32 = resource_id_; | 186 resource_id_, 0, GetSizeInBytes(), |
205 args[1].value_uint32 = 0; | 187 renderer_->transfer_shm_id(), |
206 args[2].value_uint32 = GetSizeInBytes(); | 188 renderer_->allocator()->GetOffset(lock_pointer_)); |
207 args[3].value_uint32 = renderer_->transfer_shm_id(); | |
208 args[4].value_uint32 = renderer_->allocator()->GetOffset(lock_pointer_); | |
209 helper->AddCommand(command_buffer::SET_INDEX_BUFFER_DATA, 5, args); | |
210 renderer_->allocator()->FreePendingToken(lock_pointer_, | 189 renderer_->allocator()->FreePendingToken(lock_pointer_, |
211 helper->InsertToken()); | 190 helper->InsertToken()); |
212 lock_pointer_ = NULL; | 191 lock_pointer_ = NULL; |
213 has_data_ = true; | 192 has_data_ = true; |
214 return true; | 193 return true; |
215 } | 194 } |
216 | 195 |
217 } // namespace o3d | 196 } // namespace o3d |
OLD | NEW |