#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "gpu/command_buffer/service/buffer_manager.h"
#include <stdint.h>
#include <limits>
#include <memory>
#include "base/check_op.h"
#include "base/containers/heap_array.h"
#include "base/format_macros.h"
#include "base/notreached.h"
#include "base/numerics/checked_math.h"
#include "base/strings/stringprintf.h"
#include "base/task/single_thread_task_runner.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/trace_event.h"
#include "gpu/command_buffer/service/context_state.h"
#include "gpu/command_buffer/service/error_state.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/memory_tracking.h"
#include "gpu/command_buffer/service/transform_feedback_manager.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/trace_util.h"
namespace gpu {
namespace gles2 {
namespace {
static const GLsizeiptr kDefaultMaxBufferSize = …;
}
BufferManager::BufferManager(MemoryTracker* memory_tracker,
FeatureInfo* feature_info)
: … { … }
BufferManager::~BufferManager() { … }
void BufferManager::MarkContextLost() { … }
void BufferManager::Destroy() { … }
void BufferManager::CreateBuffer(GLuint client_id, GLuint service_id) { … }
Buffer* BufferManager::GetBuffer(
GLuint client_id) { … }
void BufferManager::RemoveBuffer(GLuint client_id) { … }
void BufferManager::StartTracking(Buffer* ) { … }
void BufferManager::StopTracking(Buffer* buffer) { … }
Buffer::MappedRange::MappedRange(
GLintptr offset, GLsizeiptr size, GLenum access, void* pointer,
scoped_refptr<gpu::Buffer> shm, unsigned int shm_offset)
: … { … }
Buffer::MappedRange::~MappedRange() = default;
void* Buffer::MappedRange::GetShmPointer() const { … }
Buffer::Buffer(BufferManager* manager, GLuint service_id)
: … { … }
Buffer::~Buffer() { … }
void Buffer::OnBind(GLenum target, bool indexed) { … }
void Buffer::OnUnbind(GLenum target, bool indexed) { … }
const GLvoid* Buffer::StageShadow(bool use_shadow,
GLsizeiptr size,
const GLvoid* data) { … }
void Buffer::SetInfo(GLsizeiptr size,
GLenum usage,
bool use_shadow,
bool is_client_side_array) { … }
bool Buffer::CheckRange(GLintptr offset, GLsizeiptr size) const { … }
void Buffer::SetRange(GLintptr offset, GLsizeiptr size, const GLvoid * data) { … }
const void* Buffer::GetRange(GLintptr offset, GLsizeiptr size) const { … }
void Buffer::ClearCache() { … }
template <typename T>
GLuint GetMaxValue(const void* data, GLuint offset, GLsizei count,
GLuint primitive_restart_index) { … }
bool Buffer::GetMaxValueForRange(
GLuint offset, GLsizei count, GLenum type, bool primitive_restart_enabled,
GLuint* max_value) { … }
void Buffer::SetMappedRange(GLintptr offset, GLsizeiptr size, GLenum access,
void* pointer, scoped_refptr<gpu::Buffer> shm,
unsigned int shm_offset) { … }
void Buffer::RemoveMappedRange() { … }
void Buffer::SetReadbackShadowAllocation(scoped_refptr<gpu::Buffer> shm,
uint32_t shm_offset) { … }
scoped_refptr<gpu::Buffer> Buffer::TakeReadbackShadowAllocation(void** data) { … }
bool BufferManager::GetClientId(GLuint service_id, GLuint* client_id) const { … }
bool BufferManager::IsUsageClientSideArray(GLenum usage) { … }
bool BufferManager::UseNonZeroSizeForClientSideArrayBuffer() { … }
bool BufferManager::UseShadowBuffer(GLenum target, GLenum usage) { … }
void BufferManager::SetInfo(Buffer* buffer,
GLenum target,
GLsizeiptr size,
GLenum usage,
bool use_shadow) { … }
void BufferManager::ValidateAndDoBufferData(ContextState* context_state,
ErrorState* error_state,
GLenum target,
GLsizeiptr size,
const GLvoid* data,
GLenum usage) { … }
void BufferManager::DoBufferData(
ErrorState* error_state,
Buffer* buffer,
GLenum target,
GLsizeiptr size,
GLenum usage,
const GLvoid* data) { … }
void BufferManager::ValidateAndDoBufferSubData(ContextState* context_state,
ErrorState* error_state,
GLenum target,
GLintptr offset,
GLsizeiptr size,
const GLvoid* data) { … }
void BufferManager::DoBufferSubData(
Buffer* buffer, GLenum target, GLintptr offset, GLsizeiptr size,
const GLvoid* data) { … }
void BufferManager::ValidateAndDoCopyBufferSubData(ContextState* context_state,
ErrorState* error_state,
GLenum readtarget,
GLenum writetarget,
GLintptr readoffset,
GLintptr writeoffset,
GLsizeiptr size) { … }
void BufferManager::DoCopyBufferSubData(
Buffer* readbuffer,
GLenum readtarget,
GLintptr readoffset,
Buffer* writebuffer,
GLenum writetarget,
GLintptr writeoffset,
GLsizeiptr size) { … }
void BufferManager::ValidateAndDoGetBufferParameteri64v(
ContextState* context_state,
ErrorState* error_state,
GLenum target,
GLenum pname,
GLint64* params) { … }
void BufferManager::ValidateAndDoGetBufferParameteriv(
ContextState* context_state,
ErrorState* error_state,
GLenum target,
GLenum pname,
GLint* params) { … }
bool BufferManager::SetTarget(Buffer* buffer, GLenum target) { … }
Buffer* BufferManager::GetBufferInfoForTarget(
ContextState* state, GLenum target) const { … }
void BufferManager::SetPrimitiveRestartFixedIndexIfNecessary(GLenum type) { … }
bool BufferManager::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* pmd) { … }
Buffer* BufferManager::RequestBufferAccess(ContextState* context_state,
ErrorState* error_state,
GLenum target,
GLintptr offset,
GLsizeiptr size,
const char* func_name) { … }
Buffer* BufferManager::RequestBufferAccess(ContextState* context_state,
ErrorState* error_state,
GLenum target,
const char* func_name) { … }
bool BufferManager::RequestBufferAccess(ErrorState* error_state,
Buffer* buffer,
const char* func_name,
const char* error_message_format,
...) { … }
bool BufferManager::RequestBufferAccess(ErrorState* error_state,
Buffer* buffer,
GLintptr offset,
GLsizeiptr size,
const char* func_name,
const char* error_message) { … }
bool BufferManager::RequestBuffersAccess(
ErrorState* error_state,
const IndexedBufferBindingHost* bindings,
const std::vector<GLsizeiptr>& variable_sizes,
GLsizei count,
const char* func_name,
const char* message_tag) { … }
bool BufferManager::RequestBufferAccessV(ErrorState* error_state,
Buffer* buffer,
const char* func_name,
const char* error_message_format,
va_list varargs) { … }
}
}