#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "gpu/command_buffer/tests/gl_manager.h"
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extchromium.h>
#include <stddef.h>
#include <stdint.h>
#include <vector>
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/ptr_util.h"
#include "base/memory/ref_counted_memory.h"
#include "build/build_config.h"
#include "gpu/command_buffer/client/gles2_cmd_helper.h"
#include "gpu/command_buffer/client/gles2_implementation.h"
#include "gpu/command_buffer/client/gles2_lib.h"
#include "gpu/command_buffer/client/transfer_buffer.h"
#include "gpu/command_buffer/common/constants.h"
#include "gpu/command_buffer/common/context_creation_attribs.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "gpu/command_buffer/service/command_buffer_direct.h"
#include "gpu/command_buffer/service/context_group.h"
#include "gpu/command_buffer/service/gl_context_virtual.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/service/gpu_switches.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "gpu/command_buffer/service/service_utils.h"
#include "gpu/command_buffer/service/transfer_buffer_manager.h"
#include "gpu/ipc/common/gpu_client_ids.h"
#include "gpu/ipc/in_process_command_buffer.h"
#include "gpu/ipc/service/gpu_memory_buffer_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/buffer_format_util.h"
#include "ui/gfx/gpu_memory_buffer.h"
#include "ui/gl/gl_context.h"
#include "ui/gl/gl_share_group.h"
#include "ui/gl/gl_surface.h"
#include "ui/gl/gl_utils.h"
#include "ui/gl/init/gl_factory.h"
#if BUILDFLAG(IS_MAC)
#include "ui/gfx/mac/io_surface.h"
#endif
namespace gpu {
namespace {
void InitializeGpuPreferencesForTestingFromCommandLine(
const base::CommandLine& command_line,
GpuPreferences* preferences) { … }
class GpuMemoryBufferImplTest : public gfx::GpuMemoryBuffer { … };
#if BUILDFLAG(IS_MAC)
class IOSurfaceGpuMemoryBuffer : public gfx::GpuMemoryBuffer {
public:
IOSurfaceGpuMemoryBuffer(const gfx::Size& size, gfx::BufferFormat format)
: mapped_(false), size_(size), format_(format) {
iosurface_ = gfx::CreateIOSurface(size, gfx::BufferFormat::BGRA_8888);
}
~IOSurfaceGpuMemoryBuffer() override = default;
bool Map() override {
DCHECK(!mapped_);
mapped_ = true;
return true;
}
void* memory(size_t plane) override {
DCHECK(mapped_);
DCHECK_LT(plane, gfx::NumberOfPlanesForLinearBufferFormat(format_));
return IOSurfaceGetBaseAddressOfPlane(iosurface_.get(), plane);
}
void Unmap() override {
DCHECK(mapped_);
mapped_ = false;
}
gfx::Size GetSize() const override { return size_; }
gfx::BufferFormat GetFormat() const override { return format_; }
int stride(size_t plane) const override {
DCHECK_LT(plane, gfx::NumberOfPlanesForLinearBufferFormat(format_));
return IOSurfaceGetWidthOfPlane(iosurface_.get(), plane);
}
gfx::GpuMemoryBufferId GetId() const override {
NOTREACHED_IN_MIGRATION();
return gfx::GpuMemoryBufferId(0);
}
gfx::GpuMemoryBufferType GetType() const override {
return gfx::IO_SURFACE_BUFFER;
}
gfx::GpuMemoryBufferHandle CloneHandle() const override {
NOTREACHED_IN_MIGRATION();
return gfx::GpuMemoryBufferHandle();
}
void OnMemoryDump(
base::trace_event::ProcessMemoryDump* pmd,
const base::trace_event::MemoryAllocatorDumpGuid& buffer_dump_guid,
uint64_t tracing_process_id,
int importance) const override {}
IOSurfaceRef iosurface() { return iosurface_.get(); }
private:
bool mapped_;
base::apple::ScopedCFTypeRef<IOSurfaceRef> iosurface_;
const gfx::Size size_;
gfx::BufferFormat format_;
};
#endif
class CommandBufferCheckLostContext : public CommandBufferDirect { … };
}
int GLManager::use_count_;
scoped_refptr<gl::GLShareGroup>* GLManager::base_share_group_;
scoped_refptr<gl::GLSurface>* GLManager::base_surface_;
scoped_refptr<gl::GLContext>* GLManager::base_context_;
GpuFeatureInfo GLManager::g_gpu_feature_info;
GLManager::Options::Options() = default;
GLManager::GLManager()
: … { … }
GLManager::~GLManager() { … }
std::unique_ptr<gfx::GpuMemoryBuffer> GLManager::CreateGpuMemoryBuffer(
const gfx::Size& size,
gfx::BufferFormat format) { … }
void GLManager::Initialize(const GLManager::Options& options) { … }
void GLManager::InitializeWithWorkarounds(
const GLManager::Options& options,
const GpuDriverBugWorkarounds& workarounds) { … }
void GLManager::InitializeWithWorkaroundsImpl(
const GLManager::Options& options,
const GpuDriverBugWorkarounds& workarounds) { … }
void GLManager::BindOffscreenFramebuffer(GLenum target) { … }
size_t GLManager::GetSharedMemoryBytesAllocated() const { … }
void GLManager::SetupBaseContext() { … }
void GLManager::MakeCurrent() { … }
void GLManager::SetSurface(gl::GLSurface* surface) { … }
void GLManager::PerformIdleWork() { … }
void GLManager::Destroy() { … }
const GpuDriverBugWorkarounds& GLManager::workarounds() const { … }
void GLManager::SetGpuControlClient(GpuControlClient*) { … }
const Capabilities& GLManager::GetCapabilities() const { … }
const GLCapabilities& GLManager::GetGLCapabilities() const { … }
void GLManager::SignalQuery(uint32_t query, base::OnceClosure callback) { … }
void GLManager::CancelAllQueries() { … }
void GLManager::CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) { … }
void GLManager::GetGpuFence(
uint32_t gpu_fence_id,
base::OnceCallback<void(std::unique_ptr<gfx::GpuFence>)> callback) { … }
void GLManager::SetLock(base::Lock*) { … }
void GLManager::EnsureWorkVisible() { … }
gpu::CommandBufferNamespace GLManager::GetNamespaceID() const { … }
CommandBufferId GLManager::GetCommandBufferID() const { … }
void GLManager::FlushPendingWork() { … }
uint64_t GLManager::GenerateFenceSyncRelease() { … }
bool GLManager::IsFenceSyncReleased(uint64_t release) { … }
void GLManager::SignalSyncToken(const gpu::SyncToken& sync_token,
base::OnceClosure callback) { … }
void GLManager::WaitSyncToken(const gpu::SyncToken& sync_token) { … }
bool GLManager::CanWaitUnverifiedSyncToken(const gpu::SyncToken& sync_token) { … }
ContextType GLManager::GetContextType() const { … }
void GLManager::Reset() { … }
}