Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(236)

Unified Diff: gpu/command_buffer/tests/gl_manager.cc

Issue 1331843005: Implemented new fence syncs which replaces the old sync points. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reverted mojo readme, changed wait() to take a pointer Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/tests/gl_manager.h ('k') | gpu/gles2_conform_support/egl/display.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/tests/gl_manager.cc
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index 9c6bf41e5d6de3cf25871e1aa2ffad8eeca1b3cb..8d38fdbdc753b38fa172dad21fcb9dc0d77cae5c 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -28,6 +28,7 @@
#include "gpu/command_buffer/service/image_manager.h"
#include "gpu/command_buffer/service/mailbox_manager_impl.h"
#include "gpu/command_buffer/service/memory_tracking.h"
+#include "gpu/command_buffer/service/sync_point_manager.h"
#include "gpu/command_buffer/service/transfer_buffer_manager.h"
#include "gpu/command_buffer/service/valuebuffer_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -41,6 +42,8 @@
namespace gpu {
namespace {
+uint64_t g_next_command_buffer_id = 0;
+
class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer {
public:
GpuMemoryBufferImpl(base::RefCountedBytes* bytes,
@@ -103,6 +106,7 @@ scoped_refptr<gfx::GLContext>* GLManager::base_context_;
GLManager::Options::Options()
: size(4, 4),
+ sync_point_manager(NULL),
share_group_manager(NULL),
share_mailbox_manager(NULL),
virtual_manager(NULL),
@@ -111,7 +115,11 @@ GLManager::Options::Options()
context_lost_allowed(false),
context_type(gles2::CONTEXT_TYPE_OPENGLES2) {}
-GLManager::GLManager() : context_lost_allowed_(false) {
+GLManager::GLManager()
+ : sync_point_manager_(nullptr),
+ context_lost_allowed_(false),
+ command_buffer_id_(g_next_command_buffer_id++),
+ next_fence_sync_release_(1) {
SetupBaseContext();
}
@@ -146,6 +154,7 @@ scoped_ptr<gfx::GpuMemoryBuffer> GLManager::CreateGpuMemoryBuffer(
void GLManager::Initialize(const GLManager::Options& options) {
InitializeWithCommandLine(options, nullptr);
}
+
void GLManager::InitializeWithCommandLine(const GLManager::Options& options,
base::CommandLine* command_line) {
const int32 kCommandBufferSize = 1024 * 1024;
@@ -253,6 +262,22 @@ void GLManager::InitializeWithCommandLine(const GLManager::Options& options,
return;
}
+ if (options.sync_point_manager) {
+ sync_point_manager_ = options.sync_point_manager;
+ sync_point_order_data_ = SyncPointOrderData::Create();
+ sync_point_client_ = sync_point_manager_->CreateSyncPointClient(
+ sync_point_order_data_, GetNamespaceID(), GetCommandBufferID());
+
+ decoder_->SetFenceSyncReleaseCallback(
+ base::Bind(&GLManager::OnFenceSyncRelease, base::Unretained(this)));
+ decoder_->SetWaitFenceSyncCallback(
+ base::Bind(&GLManager::OnWaitFenceSync, base::Unretained(this)));
+ } else {
+ sync_point_manager_ = nullptr;
+ sync_point_order_data_ = nullptr;
+ sync_point_client_ = nullptr;
+ }
+
command_buffer_->SetPutOffsetChangeCallback(
base::Bind(&GLManager::PumpCommands, base::Unretained(this)));
command_buffer_->SetGetBufferChangeCallback(
@@ -304,6 +329,28 @@ void GLManager::SetupBaseContext() {
++use_count_;
}
+void GLManager::OnFenceSyncRelease(uint64_t release) {
+ DCHECK(sync_point_client_);
+ DCHECK(!sync_point_client_->client_state()->IsFenceSyncReleased(release));
+ sync_point_client_->ReleaseFenceSync(release);
+}
+
+bool GLManager::OnWaitFenceSync(gpu::CommandBufferNamespace namespace_id,
+ uint64_t command_buffer_id,
+ uint64_t release) {
+ DCHECK(sync_point_client_);
+ scoped_refptr<gpu::SyncPointClientState> release_state =
+ sync_point_manager_->GetSyncPointClientState(namespace_id,
+ command_buffer_id);
+ if (!release_state)
+ return true;
+
+ // GLManager does not support being multithreaded at this point, so the fence
+ // sync must be released by the time wait is called.
+ DCHECK(release_state->IsFenceSyncReleased(release));
+ return true;
+}
+
void GLManager::MakeCurrent() {
::gles2::SetGLContext(gles2_implementation_.get());
}
@@ -322,6 +369,12 @@ void GLManager::Destroy() {
transfer_buffer_.reset();
gles2_helper_.reset();
command_buffer_.reset();
+ sync_point_manager_ = nullptr;
+ sync_point_client_ = nullptr;
+ if (sync_point_order_data_) {
+ sync_point_order_data_->Destroy();
+ sync_point_order_data_ = nullptr;
+ }
if (decoder_.get()) {
bool have_context = decoder_->GetGLContext() &&
decoder_->GetGLContext()->MakeCurrent(surface_.get());
@@ -340,11 +393,24 @@ void GLManager::PumpCommands() {
command_buffer_->SetParseError(::gpu::error::kLostContext);
return;
}
+ uint32_t order_num = 0;
+ if (sync_point_manager_) {
+ // If sync point manager is supported, assign order numbers to commands.
+ order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber(
+ sync_point_manager_);
+ sync_point_order_data_->BeginProcessingOrderNumber(order_num);
+ }
+
gpu_scheduler_->PutChanged();
::gpu::CommandBuffer::State state = command_buffer_->GetLastState();
if (!context_lost_allowed_) {
ASSERT_EQ(::gpu::error::kNoError, state.error);
}
+
+ if (sync_point_manager_) {
+ // Finish processing order number here.
+ sync_point_order_data_->FinishProcessingOrderNumber(order_num);
+ }
}
bool GLManager::GetBufferChanged(int32 transfer_buffer_id) {
@@ -441,7 +507,19 @@ gpu::CommandBufferNamespace GLManager::GetNamespaceID() const {
}
uint64_t GLManager::GetCommandBufferID() const {
- return 0;
+ return command_buffer_id_;
+}
+
+uint64_t GLManager::GenerateFenceSyncRelease() {
+ return next_fence_sync_release_++;
+}
+
+bool GLManager::IsFenceSyncRelease(uint64_t release) {
+ return release > 0 && release < next_fence_sync_release_;
+}
+
+bool GLManager::IsFenceSyncFlushed(uint64_t release) {
+ return IsFenceSyncRelease(release);
}
} // namespace gpu
« no previous file with comments | « gpu/command_buffer/tests/gl_manager.h ('k') | gpu/gles2_conform_support/egl/display.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698