Index: components/mus/public/cpp/lib/command_buffer_client_impl.cc |
diff --git a/components/mus/public/cpp/lib/command_buffer_client_impl.cc b/components/mus/public/cpp/lib/command_buffer_client_impl.cc |
deleted file mode 100644 |
index 062c3f784779dbc80df7b3b59ca2c511960ab66f..0000000000000000000000000000000000000000 |
--- a/components/mus/public/cpp/lib/command_buffer_client_impl.cc |
+++ /dev/null |
@@ -1,370 +0,0 @@ |
-// Copyright 2014 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 "components/mus/public/cpp/lib/command_buffer_client_impl.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <limits> |
-#include <utility> |
- |
-#include "base/logging.h" |
-#include "base/process/process_handle.h" |
-#include "base/threading/thread_restrictions.h" |
-#include "components/mus/common/gpu_type_converters.h" |
-#include "components/mus/common/mojo_buffer_backing.h" |
-#include "components/mus/common/mojo_gpu_memory_buffer.h" |
-#include "gpu/command_buffer/client/gpu_control_client.h" |
-#include "gpu/command_buffer/common/command_buffer_id.h" |
-#include "gpu/command_buffer/common/gpu_memory_buffer_support.h" |
-#include "gpu/command_buffer/common/sync_token.h" |
-#include "mojo/public/cpp/system/platform_handle.h" |
- |
-namespace mus { |
- |
-namespace { |
- |
-bool CreateAndMapSharedBuffer(size_t size, |
- mojo::ScopedSharedBufferMapping* mapping, |
- mojo::ScopedSharedBufferHandle* handle) { |
- *handle = mojo::SharedBufferHandle::Create(size); |
- if (!handle->is_valid()) |
- return false; |
- |
- *mapping = (*handle)->Map(size); |
- if (!*mapping) |
- return false; |
- |
- return true; |
-} |
- |
-void MakeProgressCallback(gpu::CommandBuffer::State* output, |
- const gpu::CommandBuffer::State& input) { |
- *output = input; |
-} |
- |
-void InitializeCallback(mus::mojom::CommandBufferInitializeResultPtr* output, |
- mus::mojom::CommandBufferInitializeResultPtr input) { |
- *output = std::move(input); |
-} |
- |
-} // namespace |
- |
-CommandBufferClientImpl::CommandBufferClientImpl( |
- const std::vector<int32_t>& attribs, |
- mus::mojom::CommandBufferPtr command_buffer_ptr) |
- : gpu_control_client_(nullptr), |
- destroyed_(false), |
- attribs_(attribs), |
- client_binding_(this), |
- command_buffer_(std::move(command_buffer_ptr)), |
- command_buffer_id_(), |
- last_put_offset_(-1), |
- next_transfer_buffer_id_(0), |
- next_image_id_(0), |
- next_fence_sync_release_(1), |
- flushed_fence_sync_release_(0) { |
- command_buffer_.set_connection_error_handler( |
- base::Bind(&CommandBufferClientImpl::Destroyed, base::Unretained(this), |
- gpu::error::kUnknown, gpu::error::kLostContext)); |
-} |
- |
-CommandBufferClientImpl::~CommandBufferClientImpl() {} |
- |
-bool CommandBufferClientImpl::Initialize() { |
- const size_t kSharedStateSize = sizeof(gpu::CommandBufferSharedState); |
- mojo::ScopedSharedBufferHandle handle; |
- bool result = |
- CreateAndMapSharedBuffer(kSharedStateSize, &shared_state_, &handle); |
- if (!result) |
- return false; |
- |
- shared_state()->Initialize(); |
- |
- mus::mojom::CommandBufferClientPtr client_ptr; |
- client_binding_.Bind(GetProxy(&client_ptr)); |
- |
- mus::mojom::CommandBufferInitializeResultPtr initialize_result; |
- command_buffer_->Initialize( |
- std::move(client_ptr), std::move(handle), |
- mojo::Array<int32_t>::From(attribs_), |
- base::Bind(&InitializeCallback, &initialize_result)); |
- |
- base::ThreadRestrictions::ScopedAllowWait wait; |
- if (!command_buffer_.WaitForIncomingResponse()) { |
- VLOG(1) << "Channel encountered error while creating command buffer."; |
- return false; |
- } |
- |
- if (!initialize_result) { |
- VLOG(1) << "Command buffer cannot be initialized successfully."; |
- return false; |
- } |
- |
- DCHECK_EQ(gpu::CommandBufferNamespace::MOJO, |
- initialize_result->command_buffer_namespace); |
- command_buffer_id_ = gpu::CommandBufferId::FromUnsafeValue( |
- initialize_result->command_buffer_id); |
- capabilities_ = initialize_result->capabilities; |
- return true; |
-} |
- |
-gpu::CommandBuffer::State CommandBufferClientImpl::GetLastState() { |
- return last_state_; |
-} |
- |
-int32_t CommandBufferClientImpl::GetLastToken() { |
- TryUpdateState(); |
- return last_state_.token; |
-} |
- |
-void CommandBufferClientImpl::Flush(int32_t put_offset) { |
- if (last_put_offset_ == put_offset) |
- return; |
- |
- last_put_offset_ = put_offset; |
- command_buffer_->Flush(put_offset); |
- flushed_fence_sync_release_ = next_fence_sync_release_ - 1; |
-} |
- |
-void CommandBufferClientImpl::OrderingBarrier(int32_t put_offset) { |
- // TODO(jamesr): Implement this more efficiently. |
- Flush(put_offset); |
-} |
- |
-void CommandBufferClientImpl::WaitForTokenInRange(int32_t start, int32_t end) { |
- TryUpdateState(); |
- while (!InRange(start, end, last_state_.token) && |
- last_state_.error == gpu::error::kNoError) { |
- MakeProgressAndUpdateState(); |
- } |
-} |
- |
-void CommandBufferClientImpl::WaitForGetOffsetInRange(int32_t start, |
- int32_t end) { |
- TryUpdateState(); |
- while (!InRange(start, end, last_state_.get_offset) && |
- last_state_.error == gpu::error::kNoError) { |
- MakeProgressAndUpdateState(); |
- } |
-} |
- |
-void CommandBufferClientImpl::SetGetBuffer(int32_t shm_id) { |
- command_buffer_->SetGetBuffer(shm_id); |
- last_put_offset_ = -1; |
-} |
- |
-scoped_refptr<gpu::Buffer> CommandBufferClientImpl::CreateTransferBuffer( |
- size_t size, |
- int32_t* id) { |
- if (size >= std::numeric_limits<uint32_t>::max()) |
- return NULL; |
- |
- mojo::ScopedSharedBufferMapping mapping; |
- mojo::ScopedSharedBufferHandle handle; |
- if (!CreateAndMapSharedBuffer(size, &mapping, &handle)) { |
- if (last_state_.error == gpu::error::kNoError) |
- last_state_.error = gpu::error::kLostContext; |
- return NULL; |
- } |
- |
- *id = ++next_transfer_buffer_id_; |
- |
- command_buffer_->RegisterTransferBuffer(*id, std::move(handle), |
- static_cast<uint32_t>(size)); |
- |
- std::unique_ptr<gpu::BufferBacking> backing( |
- new mus::MojoBufferBacking(std::move(mapping), size)); |
- scoped_refptr<gpu::Buffer> buffer(new gpu::Buffer(std::move(backing))); |
- return buffer; |
-} |
- |
-void CommandBufferClientImpl::DestroyTransferBuffer(int32_t id) { |
- command_buffer_->DestroyTransferBuffer(id); |
-} |
- |
-void CommandBufferClientImpl::SetGpuControlClient(gpu::GpuControlClient* c) { |
- gpu_control_client_ = c; |
-} |
- |
-gpu::Capabilities CommandBufferClientImpl::GetCapabilities() { |
- return capabilities_; |
-} |
- |
-int32_t CommandBufferClientImpl::CreateImage(ClientBuffer buffer, |
- size_t width, |
- size_t height, |
- unsigned internalformat) { |
- int32_t new_id = ++next_image_id_; |
- |
- gfx::Size size(static_cast<int32_t>(width), static_cast<int32_t>(height)); |
- |
- mus::MojoGpuMemoryBufferImpl* gpu_memory_buffer = |
- mus::MojoGpuMemoryBufferImpl::FromClientBuffer(buffer); |
- gfx::GpuMemoryBufferHandle handle = gpu_memory_buffer->GetHandle(); |
- |
- bool requires_sync_point = false; |
- if (handle.type != gfx::SHARED_MEMORY_BUFFER) { |
- requires_sync_point = true; |
- NOTIMPLEMENTED(); |
- return -1; |
- } |
- |
- base::SharedMemoryHandle dupd_handle = |
- base::SharedMemory::DuplicateHandle(handle.handle); |
-#if defined(OS_WIN) |
- HANDLE platform_handle = dupd_handle.GetHandle(); |
-#else |
- int platform_handle = dupd_handle.fd; |
-#endif |
- |
- mojo::ScopedHandle scoped_handle = mojo::WrapPlatformFile(platform_handle); |
- command_buffer_->CreateImage( |
- new_id, std::move(scoped_handle), handle.type, std::move(size), |
- static_cast<int32_t>(gpu_memory_buffer->GetFormat()), internalformat); |
- if (requires_sync_point) { |
- NOTIMPLEMENTED(); |
- // TODO(jam): need to support this if we support types other than |
- // SHARED_MEMORY_BUFFER. |
- // gpu_memory_buffer_manager->SetDestructionSyncPoint(gpu_memory_buffer, |
- // InsertSyncPoint()); |
- } |
- |
- return new_id; |
-} |
- |
-void CommandBufferClientImpl::DestroyImage(int32_t id) { |
- command_buffer_->DestroyImage(id); |
-} |
- |
-int32_t CommandBufferClientImpl::CreateGpuMemoryBufferImage( |
- size_t width, |
- size_t height, |
- unsigned internalformat, |
- unsigned usage) { |
- std::unique_ptr<gfx::GpuMemoryBuffer> buffer( |
- mus::MojoGpuMemoryBufferImpl::Create( |
- gfx::Size(static_cast<int>(width), static_cast<int>(height)), |
- gpu::DefaultBufferFormatForImageFormat(internalformat), |
- gfx::BufferUsage::SCANOUT)); |
- if (!buffer) |
- return -1; |
- |
- return CreateImage(buffer->AsClientBuffer(), width, height, internalformat); |
-} |
- |
-int32_t CommandBufferClientImpl::GetImageGpuMemoryBufferId(unsigned image_id) { |
- // TODO(erikchen): Once this class supports IOSurface GpuMemoryBuffer backed |
- // images, it will also need to keep a local cache from image id to |
- // GpuMemoryBuffer id. |
- NOTIMPLEMENTED(); |
- return -1; |
-} |
- |
-void CommandBufferClientImpl::SignalQuery(uint32_t query, |
- const base::Closure& callback) { |
- // TODO(piman) |
- NOTIMPLEMENTED(); |
-} |
- |
-void CommandBufferClientImpl::Destroyed(int32_t lost_reason, int32_t error) { |
- if (destroyed_) |
- return; |
- last_state_.context_lost_reason = |
- static_cast<gpu::error::ContextLostReason>(lost_reason); |
- last_state_.error = static_cast<gpu::error::Error>(error); |
- if (gpu_control_client_) |
- gpu_control_client_->OnGpuControlLostContext(); |
- destroyed_ = true; |
-} |
- |
-void CommandBufferClientImpl::SignalAck(uint32_t id) {} |
- |
-void CommandBufferClientImpl::SwapBuffersCompleted(int32_t result) {} |
- |
-void CommandBufferClientImpl::UpdateState( |
- const gpu::CommandBuffer::State& state) {} |
- |
-void CommandBufferClientImpl::UpdateVSyncParameters(int64_t timebase, |
- int64_t interval) {} |
- |
-void CommandBufferClientImpl::TryUpdateState() { |
- if (last_state_.error == gpu::error::kNoError) |
- shared_state()->Read(&last_state_); |
-} |
- |
-void CommandBufferClientImpl::MakeProgressAndUpdateState() { |
- gpu::CommandBuffer::State state; |
- command_buffer_->MakeProgress(last_state_.get_offset, |
- base::Bind(&MakeProgressCallback, &state)); |
- |
- base::ThreadRestrictions::ScopedAllowWait wait; |
- if (!command_buffer_.WaitForIncomingResponse()) { |
- VLOG(1) << "Channel encountered error while waiting for command buffer."; |
- // TODO(piman): is it ok for this to re-enter? |
- Destroyed(gpu::error::kUnknown, gpu::error::kLostContext); |
- return; |
- } |
- |
- if (state.generation - last_state_.generation < 0x80000000U) |
- last_state_ = state; |
-} |
- |
-void CommandBufferClientImpl::SetLock(base::Lock* lock) {} |
- |
-void CommandBufferClientImpl::EnsureWorkVisible() { |
- // This is only relevant for out-of-process command buffers. |
-} |
- |
-gpu::CommandBufferNamespace CommandBufferClientImpl::GetNamespaceID() const { |
- return gpu::CommandBufferNamespace::MOJO; |
-} |
- |
-gpu::CommandBufferId CommandBufferClientImpl::GetCommandBufferID() const { |
- return command_buffer_id_; |
-} |
- |
-int32_t CommandBufferClientImpl::GetExtraCommandBufferData() const { |
- return 0; |
-} |
- |
-uint64_t CommandBufferClientImpl::GenerateFenceSyncRelease() { |
- return next_fence_sync_release_++; |
-} |
- |
-bool CommandBufferClientImpl::IsFenceSyncRelease(uint64_t release) { |
- return release != 0 && release < next_fence_sync_release_; |
-} |
- |
-bool CommandBufferClientImpl::IsFenceSyncFlushed(uint64_t release) { |
- return release != 0 && release <= flushed_fence_sync_release_; |
-} |
- |
-bool CommandBufferClientImpl::IsFenceSyncFlushReceived(uint64_t release) { |
- return IsFenceSyncFlushed(release); |
-} |
- |
-void CommandBufferClientImpl::SignalSyncToken(const gpu::SyncToken& sync_token, |
- const base::Closure& callback) { |
- // TODO(dyen) |
- NOTIMPLEMENTED(); |
-} |
- |
-bool CommandBufferClientImpl::CanWaitUnverifiedSyncToken( |
- const gpu::SyncToken* sync_token) { |
- // Right now, MOJO_LOCAL is only used by trusted code, so it is safe to wait |
- // on a sync token in MOJO_LOCAL command buffer. |
- if (sync_token->namespace_id() == gpu::CommandBufferNamespace::MOJO_LOCAL) |
- return true; |
- |
- // It is also safe to wait on the same context. |
- if (sync_token->namespace_id() == gpu::CommandBufferNamespace::MOJO && |
- sync_token->command_buffer_id() == GetCommandBufferID()) |
- return true; |
- |
- return false; |
-} |
- |
-} // namespace mus |