Index: o3d/gpu_plugin/gpu_processor.cc |
=================================================================== |
--- o3d/gpu_plugin/gpu_processor.cc (revision 26879) |
+++ o3d/gpu_plugin/gpu_processor.cc (working copy) |
@@ -3,76 +3,75 @@ |
// found in the LICENSE file. |
#include "o3d/gpu_plugin/gpu_processor.h" |
+#include "o3d/gpu_plugin/system_services/shared_memory_public.h" |
namespace o3d { |
namespace gpu_plugin { |
-// Placeholder command processing. |
void GPUProcessor::ProcessCommands() { |
- int32 get_offset = command_buffer_->GetGetOffset(); |
- int32 put_offset = command_buffer_->GetPutOffset(); |
- int32 size = command_buffer_->GetSize(); |
- if (size == 0) |
+ if (command_buffer_->GetErrorStatus()) |
return; |
- NPObjectPointer<CHRSharedMemory> shared_memory = |
- command_buffer_->GetRingBuffer(); |
- if (!shared_memory.Get()) |
- return; |
- if (!shared_memory->ptr) |
- return; |
+ parser_->set_put(command_buffer_->GetPutOffset()); |
- int8* ptr = static_cast<int8*>(shared_memory->ptr); |
- |
- int32 end_offset = (get_offset + sizeof(int32)) % size; |
- if (get_offset > put_offset || end_offset <= put_offset) { |
- int32 command = *reinterpret_cast<int32*>(ptr + get_offset); |
- |
- switch (command) { |
- case 0: |
- get_offset = end_offset; |
- command_buffer_->SetGetOffset(get_offset); |
+ int commands_processed = 0; |
+ while (commands_processed < commands_per_update_ && !parser_->IsEmpty()) { |
+ command_buffer::BufferSyncInterface::ParseError parse_error = |
+ parser_->ProcessCommand(); |
+ switch (parse_error) { |
+ case command_buffer::BufferSyncInterface::PARSE_UNKNOWN_COMMAND: |
+ case command_buffer::BufferSyncInterface::PARSE_INVALID_ARGUMENTS: |
+ command_buffer_->SetParseError(parse_error); |
break; |
- // Rectangle case is temporary and not tested. |
- case 1: { |
- end_offset += 20; |
- if (end_offset >= size) { |
- DCHECK(false); |
- break; |
- } |
- |
- if (get_offset <= put_offset && end_offset > put_offset) { |
- DCHECK(false); |
- break; |
- } |
- |
- uint32 color = *reinterpret_cast<uint32*>(ptr + get_offset + 4); |
- int32 left = *reinterpret_cast<int32*>(ptr + get_offset + 8); |
- int32 top = *reinterpret_cast<int32*>(ptr + get_offset + 12); |
- int32 right = *reinterpret_cast<int32*>(ptr + get_offset + 16); |
- int32 bottom = *reinterpret_cast<int32*>(ptr + get_offset + 20); |
- DrawRectangle(color, left, top, right, bottom); |
- |
- get_offset = end_offset; |
- command_buffer_->SetGetOffset(get_offset); |
- break; |
- } |
- default: |
- DCHECK(false); |
- break; |
+ case command_buffer::BufferSyncInterface::PARSE_INVALID_SIZE: |
+ case command_buffer::BufferSyncInterface::PARSE_OUT_OF_BOUNDS: |
+ command_buffer_->SetParseError(parse_error); |
+ command_buffer_->RaiseErrorStatus(); |
+ return; |
} |
+ ++commands_processed; |
} |
- // In practice, this will handle many more than one command before posting |
- // the processing of the remainder to the message loop. |
- if (get_offset != put_offset) { |
+ command_buffer_->SetGetOffset(static_cast<int32>(parser_->get())); |
+ |
+ if (!parser_->IsEmpty()) { |
MessageLoop::current()->PostTask( |
FROM_HERE, |
NewRunnableMethod(this, &GPUProcessor::ProcessCommands)); |
} |
} |
+void *GPUProcessor::GetSharedMemoryAddress(unsigned int shm_id) { |
+ // TODO(apatrick): Verify that the NPClass is in fact shared memory before |
+ // accessing the members. |
+ NPObjectPointer<CHRSharedMemory> shared_memory(static_cast<CHRSharedMemory*>( |
+ command_buffer_->GetRegisteredObject(static_cast<int32>(shm_id)).Get())); |
+ |
+ // Return address if shared memory is already mapped to this process. |
+ if (shared_memory->ptr) |
+ return shared_memory->ptr; |
+ |
+ // If the call fails or returns false then ptr will still be NULL. |
+ bool result; |
+ NPInvoke(npp_, shared_memory, "map", &result); |
+ |
+ return shared_memory->ptr; |
+} |
+ |
+size_t GPUProcessor::GetSharedMemorySize(unsigned int shm_id) { |
+ // TODO(apatrick): Verify that the NPClass is in fact shared memory before |
+ // accessing the members. |
+ NPObjectPointer<CHRSharedMemory> shared_memory(static_cast<CHRSharedMemory*>( |
+ command_buffer_->GetRegisteredObject(static_cast<int32>(shm_id)).Get())); |
+ |
+ return shared_memory->size; |
+} |
+ |
+void GPUProcessor::set_token(unsigned int token) { |
+ command_buffer_->SetToken(static_cast<int32>(token)); |
+} |
+ |
} // namespace gpu_plugin |
} // namespace o3d |